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】: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】:发生这种情况的原因有两个:
-
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)