【问题标题】:Parse SDK saveAll promise chaining解析 SDK saveAll 承诺链
【发布时间】:2015-10-03 21:52:27
【问题描述】:

来自 Parse 开发者论坛的建议说,“将 saveAll 限制为 75 个对象,除非希望 saveAll 自己进行批处理”,默认情况下是 20 个对象。并将其放入承诺链中。

我需要做一个 saveAll 承诺链,我不知道我需要多少承诺。

如何做到这一点?

我有一个数组数组。子数组的长度都是 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");

【问题讨论】:

  • 我遇到这种麻烦已经很长时间了,最​​近开始在一个库上一劳永逸地解决它 - spex。特别是批次也受支持。

标签: javascript arrays parse-platform promise


【解决方案1】:

一个很好的方法是递归地构建承诺链。如果您已经将需要保存的对象批处理成批处理,那么一些工作已经完成。

// 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);
    });
}

EDIT - 要调用它,只需调用它并处理它返回的承诺...

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. 天堂禁止 - 雇用另一个后端,记住我们通常会得到我们所支付的费用,并且解析 - 即使在免费层 - 也非常好。

【讨论】:

  • 我有一个 while 循环正在创建 Promise,你怎么看。但它没有按预期工作
  • 另外,你能给我一个例子,说明我如何从函数中调用你的方法吗?我还需要我的then 声明吗
  • 30 分钟后回到我的办公桌前。届时将进行审核。
  • 好吧,我简单地做了saveBatches(partitionedArray); 并且还在我的then 声明之前尝试了`return saveBatches(partitionedArray);`。这只会在我的表中写入 21 行。我的 OP 中的尝试写入了 189 行。在我使用 Promise 链接之前,我已经达到了 1,780 行的免费层限制。我需要达到 3000+,并且承诺链接应该是解决方案,因为我无法进行大规模的 saveAll。所以我试图以这种方式打破它
  • 我试图通过提供一个示例调用来澄清。太多的保存最终会超时......可能3k +太多了。您需要限制创建。
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 2016-04-02
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多