[英]Rate limiting parse.com background jobs
我在parse.com中有一些數據需要通過后台作業進行更新。 大約有一百行。 更新每行將使用3個解析api查詢。 我每秒只允許進行30個查詢,因此每次我運行作業時,只有前9行會更新,並且在此期間碰巧訪問系統的所有用戶都會收到錯誤。
是否有一種簡單的方法可以在作業中放置暫停,使其僅在200毫秒左右后更新一行,然后該作業僅使用可用查詢的一半? 這意味着該作業將花費大約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()
。
嘗試使用Parse.Object.saveAll
一次保存所有對象,還可以按順序將Parse Promise鏈接為@ mbm29414,如果您在forEach循環中需要其他查詢,則將其串聯。
以下代碼段顯示了使用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();
});
});
我認為您的問題是您正在以同步方式返回status.success()
,而不是等待代碼循環完成。
嘗試以下操作(從在一系列文章中鏈接Parse Promise修改而成):
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);
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.