在后台工作中解析承诺

时间:2015-09-18 09:17:08

标签: parse-platform

我的后台工作如下:

Parse.Cloud.job('checkProjectStatus', function(req, res) {
    var Project = Parse.Object.extend('Project');
    var projectQuery = new Parse.Query(Project);
    projectQuery.find().then(function(projects) {
        var promises = [];

        for(var i = 0; i < projects.length; i++) {
            var p = projects[i];
            promises.push(
                Parse.Cloud.httpRequest({
                    url: p.get('link').trim()
                }).then(function(httpResponse) {
                    console.log(httpResponse.text);
                    p.set('status', httpResponse.status);
                    return p.save();
                }, function(httpResponse) {
                    console.log('HTTP RESPONSE TEXT: ' + httpResponse.text);
                    p.set('status', httpResponse.status);
                    return p.save();
                })
            );
        }
        return Parse.Promise.when(promises);
    }).then(function() {
        res.success("DONE!");
    });
});

上述后台作业的预期处理是从Project类中获取每个对象,并对其中的字段“link”的值进行httpRequest。然后保存在相应的Project对象中返回的任何响应代码。我的代码只是更新了一个太错误的对象。有人可以告诉我上面的代码有什么问题,并指导我找到合适的代码吗?

1 个答案:

答案 0 :(得分:1)

我不熟悉Parse,但我认为你的问题是循环中闭包的一个例子:见JavaScript closure inside loops – simple practical example

promises.push()内的代码替换为promises.push(makePromise(p)),其中makePromise如下

var makePromise = function (p) {
    return Parse.Cloud.httpRequest({
                url: p.get('link').trim()
            }).then(function(httpResponse) {
                console.log(httpResponse.text);
                p.set('status', httpResponse.status);
                return p.save();
            }, function(httpResponse) {
                console.log('HTTP RESPONSE TEXT: ' + httpResponse.text);
                p.set('status', httpResponse.status);
                return p.save();
            })
};

应该解决你的问题。

您也可以按原样保留代码,并在循环中使用let代替var,具体取决于您需要支持哪些浏览器。 let is not yet widely supported.

您将let p = projects[i]而不是var p = projects[i]