限速parse.com后台工作

时间:2015-01-22 12:42:27

标签: javascript parse-platform

我在parse.com上有一些需要由后台作业更新的数据。大约有100行。更新每一行使用解析api的3个查询。我每秒只允许30次查询,因此每次运行作业时只有前9行会更新,而在此期间碰巧访问系统的所有用户都会收到错误。

是否有一种简单的方法可以在作业中暂停,以便它只在200ms左右后更新一行,然后作业只使用一半可用的查询?这意味着这项工作需要大约20秒才能运行,而不是仅仅一秒钟,但这是一个完全可以接受的权衡。

代码的结构大致如下:

Parse.Cloud.job("UpdateData", function (request, status) {
  Parse.Cloud.useMasterKey();

  (new Parse.Query("Table"))
    .find()
    .then(function (rows) {
      rows.forEach(function (row) {
        // Some queries happen here
        ...
        row
          .set(...)
          .save();
      });
      status.success();
    }, function (error) {
      status.error();
    });
});

我不认为我可以轻松地使用setTimeoutsetInterval代码(我甚至不确定他们是否被允许使用parse.com云代码)。 JS不支持sleep()wait()等任何内容。

2 个答案:

答案 0 :(得分:2)

尝试Parse.Object.saveAll一次保存所有对象,如果在forEach循环中需要其他查询,还可以将@ Pbm29414系列中的Parse promises链接起来。

以下代码段显示了使用Parse.Object.saveAll一次保存对象的简单示例:

Parse.Cloud.job("UpdateData", function (request, status) {
  Parse.Cloud.useMasterKey();

  (new Parse.Query("Table"))
    .find()
    .then(function (rows) {
      var toSaveList = [];
      var promise = new Parse.Promise();
      rows.forEach(function (row) {
        // Some queries happen here
        ...
        row.set(...);
        ...
        toSaveList.push(row)
      });
      Parse.Object.saveAll(toSaveList, function() {
        promise.resolve();
      }, function() {
        promise.reject();
      });
      return promise;
    })
    .then(function() {
      status.success();
    }, function() {
      status.error();
    });
});

答案 1 :(得分:1)

我认为您的问题是您以同步方式返回status.success(),而不是等待代码循环完成。

试试这个(从chaining Parse promises in a series修改):

Parse.Cloud.job("UpdateData", function (request, status) {
  Parse.Cloud.useMasterKey();
  var query = new Parse.Query("Table");
  query.find().then(function (rows) {
      var promise = Parse.Promise.as();
      _.each(rows, function(row) {
          promise = promise.then(function () {
              row.set(...);
              return row.save();              
          });
      });
  }).then(function () {
      // All got saved
      status.success();

  }, function (error) {
      // Something went wrong somewhere
      status.error(error);

  });
});