我尝试每次保存新笔记时向每个具有读取权限的人发送推送消息。
在伪代码中它应该获得ACL。评估ACL中的每个成员,并返回具有读访问权限的所有用户的数组。然后向每个成员发送推送通知。
我已经尝试逐个运行单独的任务,它可以正常运行。但是,当我把所有内容放在下面的代码中时,我得到了奇怪的结果。查看日志,我可以看到它没有像我期望的那样按顺序执行。我首先虽然getACL调用是异步调用,所以我试图实现promises而没有运气。然后在stackoverflow的帮助下我发现getACL不是异步的,因此代码应该正常工作,对吗?
这就是我正在尝试的:
Parse.Cloud.afterSave("Notes", function(request) {
var idsToSend = [];
var i = 0;
console.log("1 start");
var objACL = request.object.getACL();
var ACLinJSON = objACL.toJSON();
console.log("2 ACL = " + ACLinJSON);
for (var key in ACLinJSON) {
if (ACLinJSON[key].read == "true") {
idsToSend[i] = key.id;
console.log("3 i = " + i + " = " + idsToSend[i]);
i++;
}
}
console.log("4 idsToSend = " + idsToSend);
//lookup installations
var query = new Parse.Query(Parse.Installation);
query.containedIn('user', idsToSend);
Parse.Push.send({
where: query,
data: {
alert: "note updated"
}
}, {
success: function() {
console.log("Success sent push");
},
error: function(error) {
console.error("can’t find user"); //error
}
});
});
这是我从解析日志中看到的响应
I2014-08-04T08:08:06.708Z]4 idsToSend =
I2014-08-04T08:08:06.712Z]2 ACL = [object Object]
I2014-08-04T08:08:06.714Z]1 start
I2014-08-04T08:08:06.764Z]Success sent push
一切都完全失灵了?
如何以书面方式执行上述功能?
答案 0 :(得分:1)
我发现日志在运行时也没有顺序,可能是时间问题或其他问题,当他们在同一时间内忽略订单时,我已经做了其他测试以确认事情确实按照我自己的Cloud Code顺序运行......让我在那里完全困惑了一段时间。
您遇到的问题是日志#3永远不会被点击...尝试跟踪它自己的ACLinJSON
以查看实际结构。当您将其附加到字符串时,它会如您所见输出[object Object]
,所以请改为console.log(ACLinJSON);
。
这是我见过的结构:
{
"*":{"read":true},
"Administrator":{"write":true}
}
基于此,我希望你的循环可以工作,但它可能有不同程度的包装。
更新:
原来问题是寻找字符串" true"而不是布尔值true,因此修复是替换以下行:
// replace this: if (ACLinJSON[key].read == "true") {
if (ACLinJSON[key].read == true) {