javascript - 如何将后台作业转换为函数之类的东西?

标签 javascript android parse-platform

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

我有多个类别的多份报纸,总共超过 30 对,(我以后必须包括更多对,因为我想包括区域性报纸)。到现在为止,我一直在处理一份报纸和一个类别——印度教、体育类别;现在工作正常。我认为复制这两个功能并创造就业机会效率不高。

因此,我想问问我是否可以将这些作业和 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.");
});
});

保存前 -

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();
  }
});
});

最佳答案

在您的工作代码中,您可以在数据存储中查询要处理的所有 URL,然后遍历请求每个 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)  
      }
    }
}

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

关于javascript - 如何将后台作业转换为函数之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309519/

相关文章:

java - WebDriver 从 Javascript CSS 下拉菜单中选择选项在 IDE 中工作,而不是在代码中工作

android - 找不到 android.arch.navigation :navigation-safe-args-gradle-plugin:2. 3.5.?

android - GCM registrationId 稀有字符

android - 是否有API或SDK可以在SmartPhone for Android TV上创建远程控制应用程序

ios - FBSDK登录错误码: 308 in Objective-C

Javascript 调用嵌套函数

javascript - 如何实现Google饼图(带有图例显示和相应的值)

javascript - 错误类型错误 : Cannot read property 'split' of undefined cordova-plugin-contact

ios - 如何更新 PFUser.currentUser() 对象中的字段?

ios - 仅在通过解析保存数据后执行/触发 segue