来自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个小批量,注意在按两次按钮之间的间隔(“一个密西西比州,两个密西西比州...”)
天堂禁止-雇用另一个后端,记住我们通常会得到我们所支付的东西,并且解析-即使在免费层-都很好。

09-25 19:33