【问题标题】:Parse Javascript Cloud Code .save() works only on a single userParse Javascript Cloud Code .save() 仅适用于单个用户
【发布时间】:2014-12-12 10:09:50
【问题描述】:

我在 iOS 中使用 Parse 运行云代码方法,该方法在请求中获取 ID 并在响应中接收数字。

云代码功能的目的是获取请求ID,并将其添加到3个不同用户的字段中。

这里是Javascript中的云代码方法:

amount = 3;
// Use Parse.Cloud.define to define as many cloud functions as you want.
// For example:
Parse.Cloud.define("addToIDs", function(request, response) {

   var value = request.params.itemId;

   var query = new Parse.Query(Parse.User);
   query.ascending("createdAt");
   query.limit(100);
   query.find({
     success: function(results) {
      var sent = 0;
      for (var i = 0; i < results.length; i++) {
        var idlst = results[i].get("idString"); 
        if (idlst != null && idlst.indexOf(value) <= -1) {
          idlst += value+"|";
          results[i].set("idString", idlst);
          results[i].save();
          sent = sent+1;
        }
        if (sent >= amount) {
          break;
        }
      }
      response.success(sent);
    },
    error: function() {
      response.error("Test failed");
    }
  });
});

运行此云代码方法时,我得到“3”的响应,这意味着它为 3 个用户调用了 .save。问题是当我回去查看解析网站中的数据库查看器时,它实际上只更新了一个用户(它总是同一个用户)。无论我运行多少次这段代码,它实际上只会更新第一个用户..

有人知道为什么会这样吗?

【问题讨论】:

    标签: javascript ios parse-platform cloud


    【解决方案1】:

    save 和 saveAll 都是异步的,所以你应该确保保存过程已经完成。 另请注意,用户对象只能由所有者更新或使用masterkey 请求。

    以下代码应该可以工作:

    var amount = 3;
    Parse.Cloud.define("addToIDs", function(request, response) {
    
        var value = request.params.itemId;
    
        var query = new Parse.Query(Parse.User);
        query.ascending("createdAt");
        query.limit(100);
        return query.find()
            .then(function(results) { // success
                var toSave = [];
                var promise = new Parse.Promise();
                for (var i = 0; i < results.length; i++) {
                    var idlst = results[i].get("idString");
                    if (idlst != null && idlst.indexOf(value) <= -1) {
                        idlst += value+"|";
                        results[i].set("idString", idlst);
                        toSave.push(results[i]);
                    }
                    if (toSave.length >= amount) {
                        break;
                    }
                }
                // use saveAll to save multiple object without bursting multiple request
                Parse.Object.saveAll(toSave, {
                    useMasterKey: true,
                    success: function(list) {
                        promise.resolve(list.length);
                    },
                    error: function() {
                        promise.reject();
                    }
                });
                return promise;    
            }).then(function(length) { // success
                response.success(length);
            }, function() { // error
                response.error("Test failed");
            });
    });
    

    【讨论】:

      【解决方案2】:

      发生这种情况的原因有两个:

      1. save() 是一种异步方法,并且
      2. response.success() 会在调用后立即终止正在运行的代码。

      所以发生的情况是,在您的 for 循环中,您正在运行 save() 多次,但由于它是异步的,因此它们只是被放入处理队列中并且您的 for 循环继续进行。因此,它会迅速将您的所有 save() 放入处理队列,然后到达您的 response.success() 调用,但在调用时,只有一个 save() 有机会成功处理。

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2014-04-21
        • 2016-04-17
        • 2015-05-29
        • 2014-11-20
        • 2016-08-30
        • 2015-10-25
        相关资源
        最近更新 更多