我在parse.com上有一些需要由后台作业更新的数据。大约有100行。更新每一行使用解析api的3个查询。我每秒只允许30次查询,因此每次运行作业时只有前9行会更新,而在此期间碰巧访问系统的所有用户都会收到错误。
是否有一种简单的方法可以在作业中暂停,以便它只在200ms左右后更新一行,然后作业只使用一半可用的查询?这意味着这项工作需要大约20秒才能运行,而不是仅仅一秒钟,但这是一个完全可以接受的权衡。
代码的结构大致如下:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
rows.forEach(function (row) {
// Some queries happen here
...
row
.set(...)
.save();
});
status.success();
}, function (error) {
status.error();
});
});
我不认为我可以轻松地使用setTimeout
或setInterval
代码(我甚至不确定他们是否被允许使用parse.com云代码)。 JS不支持sleep()
或wait()
等任何内容。
答案 0 :(得分:2)
尝试Parse.Object.saveAll
一次保存所有对象,如果在forEach循环中需要其他查询,还可以将@ Pbm29414系列中的Parse promises链接起来。
以下代码段显示了使用Parse.Object.saveAll
一次保存对象的简单示例:
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
(new Parse.Query("Table"))
.find()
.then(function (rows) {
var toSaveList = [];
var promise = new Parse.Promise();
rows.forEach(function (row) {
// Some queries happen here
...
row.set(...);
...
toSaveList.push(row)
});
Parse.Object.saveAll(toSaveList, function() {
promise.resolve();
}, function() {
promise.reject();
});
return promise;
})
.then(function() {
status.success();
}, function() {
status.error();
});
});
答案 1 :(得分:1)
我认为您的问题是您以同步方式返回status.success()
,而不是等待代码循环完成。
试试这个(从chaining Parse promises in a series修改):
Parse.Cloud.job("UpdateData", function (request, status) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query("Table");
query.find().then(function (rows) {
var promise = Parse.Promise.as();
_.each(rows, function(row) {
promise = promise.then(function () {
row.set(...);
return row.save();
});
});
}).then(function () {
// All got saved
status.success();
}, function (error) {
// Something went wrong somewhere
status.error(error);
});
});