解析CloudCode的执行顺序



我试图在每次保存新笔记时向每个具有读访问权限的人发送推送消息。

在伪代码中,它应该得到ACL。计算ACL中的每个成员并返回具有读访问权限的所有用户的数组。然后向每个成员发送推送通知。

我试过一个接一个地运行单独的任务,它工作正常。然而,当我把所有的东西放在下面的代码,我得到奇怪的结果。查看日志,我可以看到它没有按照我期望的顺序执行。我首先认为getACL调用是一个异步调用,所以我试图实现承诺,但没有成功。然后在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
        }
    });
});

这是我从parse log

中看到的响应
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

一切都完全乱了??

我如何按照上面写的方式执行上面的函数?

我发现日志是不顺序的,当我运行的东西,也可能是一个时间问题或其他东西,忽略顺序时,他们在同一秒,我已经做了其他测试,以确认事情真的运行在我自己的云代码…这让我很困惑。

你遇到的问题是日志#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) {

最新更新