解析 CloudCode 的执行顺序

Posted

技术标签:

【中文标题】解析 CloudCode 的执行顺序【英文标题】:Parse CloudCode order of execution 【发布时间】:2014-08-04 08:17:15 【问题描述】:

每次保存新笔记时,我都会尝试向具有读取权限的每个人发送推送消息。

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

我试过一个一个地运行单独的任务,它工作正常。但是,当我将所有内容放在以下代码中时,我得到了奇怪的结果。查看日志,我可以看到它没有按我预期的顺序执行。我首先虽然 getACL 调用是一个异步调用,所以我尝试实现承诺但没有运气。然后在 *** 的帮助下,我发现 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

一切都完全不正常了??

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

【问题讨论】:

【参考方案1】:

我发现当我运行时日志也没有按顺序排列,可能是时间问题或其他问题,当它们在同一秒时忽略顺序,我已经做了其他测试以确认事情确实运行为了在我自己的云代码上……让我完全困惑了一段时间。

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

【讨论】:

感谢您的帮助!我无法克服不按顺序输入的日志,但是在你说这就是我的问题之后,我发现在我的 if 语句中我应该只使用单 = 符号。这是javascript的东西吗? 使用单个 = 将执行分配并返回分配的值(这将评估为“真实”的答案)。当你想比较值时,一定要继续使用== 这就是我的想法,但是在查看输出并目视检查它确实是真的之后,双 = 不起作用。你能在字符串上做这样的直接比较吗? 是的,你可以。尝试在 if 语句之前添加 console.log(ACLinJSON[key]); 并查看字符串值是什么,也许还要记录 ACLinJSON[key].read 的值,尝试调试时记录越多越好! 好的排序了。我认为在查看 JSON 结构时,一切都是字符串。但是我发现这不是真的,所以删除引号对我的问题进行了排序。感谢您的所有帮助

以上是关于解析 CloudCode 的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

sql语句解析顺序和执行顺序

javascript执行顺序

如何确保JavaScript的执行顺序

JS执行顺序

Javascript加载执行顺序

顺序芹菜任务执行