来自Parse开发人员论坛的建议说“将saveAll限制为75个对象,除非一个人希望saveAll进行自己的批处理”,默认情况下为20个对象。并将其放在一个承诺链中。
我需要做一个saveAll Promise链,我不知道我需要多少个Promise。
怎么做?
我有一个数组数组。子数组的长度均为75。我需要将主数组的所有索引都保存在Promise中。
var savePromises = []; // this will collect save promises
while((partition=partitionedArray.pop()) != null){
savePromises.push(Parse.Object.saveAll(partition, {
success: function(objs) {
// objects have been saved...
},
error: function(error) {
// an error occurred...
status.error("something failed");
}
}));
}
return Parse.Promise.when(savePromises);
}).then(function() {
// Set the job's success status
status.success("successful everything");
最佳答案
做到这一点的一种好方法是递归地建立承诺链。如果您已经将需要保存的对象进行了批处理,那么一些工作已经完成。
// assume batches is [ [ unsaved_object0 ... unsaved_object74 ], [ unsaved_object75 ... unsaved_object149 ], ... ]
function saveBatches(batches) {
if (batches.length === 0) { return Parse.Promise.as(); }
var nextBatch = batches[0];
return Parse.Object.saveAll(nextBatch).then(function() {
var remainingBatches = batches.slice(1, batches.length);
return saveBatches(remainingBatches);
});
}
编辑-要调用它,只需调用它并处理它返回的承诺即可。
function doAllThoseSaves() {
var batches = // your code to build unsaved objects
// don't save them yet, just create (or update) e.g....
var MyClass = Parse.Object.extend("MyClass")
var instance = new MyClass();
// set, etc
batches = [ [ instance ] ]; // see? not saved
saveBatches(batches).then(function() {
// the saves are done
}, function(error) {
// handle the error
});
}
编辑2-在某些时候,您想要的事务将不符合免费套餐的突发限制,而散布(以某种方式)将不符合超时限制。
我一直在努力解决类似的问题。就我而言,这是一种罕见的面向管理员的迁移。对于最终用户而言,它非常稀有且看不见,使我对固溶解决方案不满意。现在,这是一个不同的问题,但是有关可靠解决方案的一些想法可能是:
请参阅从客户端运行的underscore.js _.throttle(),以随着时间的推移分散交易
运行您自己的节点服务器,该节点服务器将调用限制为类似于_.throttle()的解析(或相等)。
经常运行的解析计划作业,一次咬一口(我的案例涉及一个导入文件,因此我可以快速将其保存,在作业中将其打开,计算到目前为止已创建的对象数,相应地扫描到文件中,然后进行另一批处理)
我当前的解决方案(非常笨拙,但功能强大):管理员用户手动请求N个小批量,注意在按两次按钮之间的间隔(“一个密西西比州,两个密西西比州...”)
天堂禁止-雇用另一个后端,记住我们通常会得到我们所支付的东西,并且解析-即使在免费层-都很好。