如何将后台作业转换为类似函数的内容

How can I convert background jobs to something like functions?

本文关键字:函数 后台作业 转换      更新时间:2023-09-26

我正在制作一个新闻阅读器应用程序,并使用Parse.com后台作业从报纸的RSS提要中收集链接。我使用xmlreader.js和sax.js解析httpResponse,并使用saveAll和beforeSave定期更新数据浏览器中的类。

我有多份报纸,有多个类别,总共有30多对(我以后必须包括更多的一对,因为我想包括地区报纸)。到目前为止,我在一家报纸和一个类别工作——印度教,体育类别;现在运行良好。我认为复制这两种功能并创造就业机会不会有效率。

因此,我想问我是否可以将这些jobs和beforeSave转换为某种函数,这样我就可以传入报纸类别对类名或其url来自动执行这些操作。

完整代码-main.js

作业-

Parse.Cloud.job("job_hindu_sports", function (request, response) {
return Parse.Cloud.httpRequest({
    url: 'http://www.thehindu.com/sport/?service=rss'
}).then(function(httpResponse) {
    var someXml = httpResponse.text;
    xmlreader.read(someXml, function (err, res){
        if(err) {
            response.error("Error " +err);
            return console.log(err);
        }   
        var listArray = [];
        res.rss.channel.item.each(function (i, item){
            var hinduSports = new HinduSports(); //@startswithaj - this part
            hinduSports.set("link", item.link.text());
            hinduSports.set("title", item.title.text());
            hinduSports.set("pubDate", item.pubDate.text());
            //console.log("pubDate - "+ item.pubDate.text());
            listArray.push(hinduSports);
        });
        var promises = [];
        Parse.Object.saveAll(listArray, {
                success: function(objs) {
                    promises.push(objs);
                    console.log("SAVED ALL!");
                },
                error: function(error) { 
                    console.log("ERROR WHILE SAVING - "+error);
                }   
            });
        return Parse.Promise.when(promises);        
    });
}).then(function() {
        response.success("Saving completed successfully.");
        },function(error) {
        response.error("Uh oh, something went wrong.");
});
});

beforeSave-

Parse.Cloud.beforeSave("HinduSports", function(request, response) {
//console.log("in beforeSave");
var query = new Parse.Query(HinduSports);
var linkText = request.object.get("link")
var titleText = request.object.get("title");
query.equalTo("link", linkText);
query.first({
  success: function(object) {
    //console.log("in query");
    if (object) {
        //console.log("found");
        if(object.get('title')!==titleText){
            console.log("title not same");
            object.set("title", titleText);
            response.success();
        }
        else{
            console.log("title same");
            response.error();
        }
    } else {
        console.log("not found");
        response.success();
    }
  },
  error: function(error) {
    response.error();
  }
});
});

在作业代码中,您可以查询数据存储中要处理的所有URLS,然后遍历请求每个url的结果,并将httpresponse传递给执行所有工作的函数

所以你会有(伪代码)

function getDataForNewspaper(id, url){
    return (function(id) {
        Parse.Cloud.httpRequest({
            url: url
        }).then(function(httpResponse){
           processDataForNewspaper(id, httpResponse)
        })
    })(id) //you need to have this in a closure so you can pass id to processDataFor...
function processDataforNewpaper(id, httpResponse){
  someXml = httpResponse.text
  //process your xml here 
}
Parse.Cloud.job("get_data_for_all_newspapers", function (request, response) {
    var query = new Parse.Query("Get all the newspapers").find{
      success: function(list){ 
         for each newspaper in list then 
              getDataForNewspaper(newspaper.id, newspaper.url)  
      }
    }
}

这不是最好的解释,但我希望这能帮助

在@startswithaj的帮助下,我修改了代码,将所有文章保存在一个类中。剩下的就是添加一个beforeSave方法。但仍然存在一个问题。CCD_ 2只是偶尔完成。例如,我第一次运行代码,并在日志中得到了这个:

I2014-04-26T18:18:40.036Z] v93: Ran job job_get_data_for_all_newspapers with:
Input: {}
Result: Saving completed successfully.
I2014-04-26T18:18:40.926Z] Successfully retrieved 2
I2014-04-26T18:18:40.926Z] getData NEW & CAT ID - 1, 5 feedUrl http://www.thehindu.com/sport/?service=rss
I2014-04-26T18:18:40.927Z] getData NEW & CAT ID - 1, 4 feedUrl http://www.thehindu.com/news/national/?service=rss
I2014-04-26T18:18:40.927Z] promisesGetNP [object Object],[object Object]
I2014-04-26T18:18:41.479Z] processData NEW & CAT ID - 1, 5
I2014-04-26T18:18:41.622Z] listArray http://www.thehindu.com/sport/other-sports/mankirat-singh-sets-record/article5951540.ece?utm_source=RSS_Feed&utm_medium=RSS&utm_campaign=RSS_Syndication
I2014-04-26T18:18:41.628Z] promises undefined
I2014-04-26T18:18:41.629Z] promisesGetData 
I2014-04-26T18:18:41.629Z] Done getData? 
I2014-04-26T18:18:42.082Z] processData NEW & CAT ID - 1, 4
I2014-04-26T18:18:42.311Z] listArray http://www.thehindu.com/news/national/muslim-women-entitled-to-maintenance-even-after-divorce-supreme-court/article5951562.ece?utm_source=RSS_Feed&utm_medium=RSS&utm_campaign=RSS_Syndication
I2014-04-26T18:18:42.324Z] promises undefined
I2014-04-26T18:18:42.324Z] promisesGetData 
I2014-04-26T18:18:42.324Z] Done getData? 
I2014-04-26T18:18:42.324Z] done job

第二次,在删除了几个无用的console.log之后,我得到了这个。您可以看到在saveAll-的success: function中调用了一个SAVED ALL!

I2014-04-26T18:20:53.130Z] v94: Ran job job_get_data_for_all_newspapers with:
Input: {}
Result: Saving completed successfully.
I2014-04-26T18:20:53.307Z] Successfully retrieved 2
I2014-04-26T18:20:53.307Z] getData NEW & CAT ID - 1, 5 feedUrl http://www.thehindu.com/sport/?service=rss
I2014-04-26T18:20:53.307Z] getData NEW & CAT ID - 1, 4 feedUrl http://www.thehindu.com/news/national/?service=rss
I2014-04-26T18:20:53.911Z] processData NEW & CAT ID - 1, 5
I2014-04-26T18:20:53.951Z] listArray http://www.thehindu.com/sport/other-sports/mankirat-singh-sets-record/article5951540.ece?utm_source=RSS_Feed&utm_medium=RSS&utm_campaign=RSS_Syndication
I2014-04-26T18:20:53.995Z] Done getData? 
I2014-04-26T18:20:54.200Z] SAVED ALL!
I2014-04-26T18:20:54.818Z] processData NEW & CAT ID - 1, 4
I2014-04-26T18:20:55.016Z] listArray http://www.thehindu.com/news/national/muslim-women-entitled-to-maintenance-even-after-divorce-supreme-court/article5951562.ece?utm_source=RSS_Feed&utm_medium=RSS&utm_campaign=RSS_Syndication
I2014-04-26T18:20:55.031Z] Done getData? 
I2014-04-26T18:20:55.031Z] done job

我的新代码可以在这里找到。新代码从第150行开始。