我的后台工作如下:
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对象中返回的任何响应代码。我的代码只是更新了一个太错误的对象。有人可以告诉我上面的代码有什么问题,并指导我找到合适的代码吗?
答案 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]
。