如何将后台作业转换为类似函数的内容
How can I convert background jobs to something like functions?
我正在制作一个新闻阅读器应用程序,并使用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行开始。
相关文章:
- 当绑定到AngularJS中的函数时,会在后台发生什么
- 在 parse.com 中保存对象后计划后台作业
- 如何在JavaScript中创建一个等待函数,允许您在后台运行音频等内容
- 在Jenkins作业配置页面中,当我的自定义构建步骤添加到作业配置页面时,如何调用JavaScript函数
- 无法部署分析后台作业
- 使用解析服务器的后台作业&Heroku调度器
- 使用节点 JS 运行连续后台作业
- 我可以在 Chrome 打包应用中从后台页面调用变量或函数吗?
- 如何在“后台”/不冻结UI的情况下运行javascript函数
- 当调用Javascript函数时,后台会发生什么
- Parse.com后台作业云代码无法调用方法'那么'的未定义
- 从网页的后台调用函数
- 如何从解析云中获取完整的用户详细信息,并将其用于后台作业功能
- 如何设置查询.限制后台作业
- 引用解析.后台作业中的用户
- 我怎么能有一个解析后台作业循环通过一个函数为每个用户
- 云代码解析RSS CDATA后台作业
- 分析后台作业添加多条记录导致错误
- 如何将后台作业转换为类似函数的内容
- 解析后台作业不保存文本文件