解析SDK saveAll承诺链接

时间:2015-07-15 02:33:42

标签: javascript arrays parse-platform promise

来自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");

1 个答案:

答案 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 - 在某些时候,您想要的交易将不符合免费套餐的突发限制,并且分散(以某种方式)将不符合超时限制。

我一直在努力解决类似的问题。就我而言,这是一种罕见的,面向管理员的迁移。对最终用户来说足够罕见且不可见,让我对一个可靠的解决方案感到懒惰。现在,这是一个不同的问题,但是对于可靠解决方案的一些想法可能是:

  1. 请参阅从客户端运行的underscore.js _.throttle(),以便随时间推移出事务
  2. 运行您自己的节点服务器,将调用限制为类似(或等于)解析到_.throttle()。
  3. 一个经常运行的解析预定作业,一次只占一小部分(我的情况涉及一个导入文件,所以我最初可以快速保存,在作业中打开它,计算我创建的对象数量)到目前为止,扫描相应的文件,并做另一批)
  4. 我当前的(额外的愚蠢但功能性)解决方案:管理员用户手动请求N个小批量,在按钮按下之间注意间隔这些请求(“一个密西西比,两个密西西比......”)
  5. 天堂禁止 - 雇用另一个后端,记住我们通常得到我们付出的代价,解析 - 即使在免费级别 - 也非常好。