在Parse中,我只能将Installation
表分段,以便向特定数量的用户发送推送通知。所以,我在sendPush
表中创建了一个名为Installation
的列,我将在发送推送通知时将其用于分段。
每当电子邮件在另一个表格中匹配时,我想将新列设置为true - SendPushTo
。
这两个表(带属性):
安装(email,sendPush)
SendPushTo (电子邮件)
如果电子邮件在sendPush
表中,我想简单地将SendPushTo
(布尔类型)设置为true。换句话说,对于两个表中的电子邮件地址,将sendPush
设置为true。
我曾尝试编写解析云代码来解决此问题,但由于某种原因,它只更新了9个值。
以下是代码:
Parse.Cloud.define("setPushVals", function(request, response) {
Parse.Cloud.useMasterKey();
var sendPushTo = Parse.Object.extend("SendPushTo"); //table with emails
var pushQuery = new Parse.Query(sendPushTo);
pushQuery.limit(1000);
var columnName = "sendPush";
var recipientQuery = new Parse.Query(Parse.Installation);
recipientQuery.limit(1000);
recipientQuery.matchesKeyInQuery("email", "email", pushQuery);
recipientQuery.find({
success: function(recipients) {
var i;
for (i = 0; i < recipients.length; i++) {
var recipient = recipients[i];
recipient.set(columnName, true);
recipient.save ();
}
response.success("Updated " + recipients.length + "-many recipients");
},
error:function (error)
{
response.error("Failed to save vote. Error=" + error.message);
}
});
});
如果我重新运行添加了这一行的代码(在调用find之前):
recipientQuery.notEqualTo(columnName, true);
...它会更新接下来的9行。因此,我目前使用的解决方案是多次调用函数(setPushVals
)(每次将另外9行设置为true),直到所有行都更新为止。
另外,我应该注意recipients.length
总是作为要更新的当前行数而出现,但是当我检查Parse时,只更新了9个。
有没有更简单的方法来做到这一点,为什么它只更新九行?
谢谢。
答案 0 :(得分:0)
为什么它只更新九行?
你可能是timing out。从Parse Cloud Code Guide:
在15秒的挂钟时间后,云功能将被杀死... 如果您需要更多时间在Cloud Code中执行操作,请考虑使用background job。
编辑:
我还应该指出这段代码:
for (i = 0; i < recipients.length; i++) {
var recipient = recipients[i];
recipient.set(columnName, true);
recipient.save ();
}
response.success("Updated " + recipients.length + "-many recipients");
不等待保存完成。它遍历所有收件人并将它们保存在后台。当循环代码完成时,它会调用response.success(...)
,这会停止任何进一步的执行。
您应该使用promises并行运行保存代码并等待所有任务完成,然后您可以调用成功/失败。例如,您的代码可能是:
recipientQuery.find().then(function(recipients) {
var promises = [];
for (var i = 0; i < recipients.length; i++) {
var recipient = recipients[i];
recipient.set(columnName, true);
promises.push(recipient.save ());
});
// Return a new promise that is resolved when all of the saves are finished.
return Parse.Promise.when(promises);
}).then(function() {
response.success(...);
}, function(error) {
response.error(error.message);
});