来自Parse开发者论坛的建议说“将saveAll限制为75个对象,除非有人想让saveAll自己制作批次”,默认情况下是20个对象。并把它放在一个承诺链中。
我需要做一个saveAll承诺链,我不知道我需要多少承诺。
如何做到这一点?
我有一个阵列数组。子数组的长度都是75.我需要将master数组的所有索引都保存在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");
答案 0 :(得分:1)
这样做的好方法是递归地构建promise链。如果您已经将需要保存的对象批量批量处理,那么已经完成了一些工作。
// 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 - 在某些时候,您想要的交易将不符合免费套餐的突发限制,并且分散(以某种方式)将不符合超时限制。
我一直在努力解决类似的问题。就我而言,这是一种罕见的,面向管理员的迁移。对最终用户来说足够罕见且不可见,让我对一个可靠的解决方案感到懒惰。现在,这是一个不同的问题,但是对于可靠解决方案的一些想法可能是: