Parse Javascript Cloud Code .save() 仅适用于单个用户

Posted

技术标签:

【中文标题】Parse Javascript Cloud Code .save() 仅适用于单个用户【英文标题】:Parse Javascript Cloud Code .save() works only on a single user 【发布时间】: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。问题是当我回去查看解析网站中的数据库查看器时,它实际上只更新了一个用户(它总是同一个用户)。无论我运行多少次这段代码,它实际上只会更新第一个用户..

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

【问题讨论】:

【参考方案1】:

savesaveAll 都是异步的,所以你应该确保保存过程已经完成。 另请注意,用户对象只能由所有者更新或使用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】:

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

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

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

【讨论】:

以上是关于Parse Javascript Cloud Code .save() 仅适用于单个用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Parse cloud Javascript SDK 中创建此查询?

将 Java 字符串数组或 JSON 字符串转换为 Javascript 数组(Parse.com Cloud Code 和 Mandrill)

Parse Cloud 函数中的零返回

删除 Parse Cloud Code 中的其他文件

未能通过 Mandril & Parse-Cloud-Code 发送超过 9 封电子邮件

从 Parse.com 云代码(Javascript SDK)获取信息的最佳方式