【问题标题】:Does Meteor.methods() preserve causality?Meteor.methods() 是否保留因果关系?
【发布时间】:2013-01-16 23:00:38
【问题描述】:

我可以假设对 Meteor 方法的调用将完全按照它们在客户端上发布的顺序在服务器上执行吗?换句话说:Meteor 方法是否保留了因果关系?

编辑:无论答案是什么 - 这可能应该进入文档,除非我在那里忽略了它。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    在给定的客户端/服务器连接上,服务器按顺序处理来自客户端的消息(方法调用、子/取消子请求等)。在发生以下两种情况之一之前,服务器不会开始处理消息 N+1:

    • 它完成处理消息N。对于方法,这意味着方法体完成运行。对于订阅,这意味着发布处理程序完成运行。
    • 消息N为方法调用,方法体调用this.unblock

    (可以想象将来会放宽这些限制,例如可以并行处理多个订阅方法。)

    【讨论】:

    • 大卫,感谢您的解释。这是我的假设,但我在示例中感到困惑,为什么在我的第二种方法中我的this.unblock 调用时服务器上的console.log 不是first-third-second?
    【解决方案2】:

    注意:我认为以下内容是正确的,但我还无法在我的代码中确认。我想从流星核心小组获得更多意见。

    也就是说,这些是我最初的想法:

    如果您调用服务器上的方法没有使用this.unblock,该函数将同步运行,因此阻止所有其他服务器端调用。这是唯一场景,您可以保证Meteor.method 调用的顺序。 The docs 给出一个很好的概述。

    否则,this.unblock 的方法将在服务器上异步运行,因此您将无法保证排序。

    但是,我还没有在我的代码中确认这一点。无论服务器端代码中的this.unblock 是什么,控制台都会按照第一-第二-第三顺序记录消息。在服务器上,我希望顺序是前三秒。

    if (Meteor.isServer) {
        Meteor.methods({
            first: function() {
                console.log("server first");
                return "right away";
            },
            second: function () {
                this.unblock();
                for(var i = 0; i < 10000000; i++) {}
                console.log("server second");
                return "second one";
            },
            third: function () {
                console.log("server third");
                return "last";
            },
        });
    }
    
    if (Meteor.isClient) {
        Meteor.startup(function() {
            Meteor.call("first", function(error, result) {
                console.log("first completed: " + result);
            });
            Meteor.call("second", function(error, result) {
                console.log("second completed: " + result);
            });
            Meteor.call("third", function (error, result) {
                console.log("third completed: " + result);
            });
        });
    }
    

    【讨论】:

    • 谢谢!收到回复后,您会在此处更新您的答案吗?
    • 先生,我当然会 :) 仅供参考——上面发帖的 David Glasser 是核心开发人员之一。您可以关注那里的评论线程以获取更新。
    • 这仍然是单线程 JavaScript。调用unblock 允许服务器处理更多消息......但它仍然必须实际获取处理消息的代码,例如通过屈服。如果在this.unblock 之后插入Meteor._sleepForMs(1),您应该会在第二个之前看到第三个。 (此调用使用 Fibers 产生 1 毫秒,在此期间事件循环将运行并引入下一条消息。)数据库调用也将产生,因此 unblock 的典型使用将涉及调用 unblock 然后执行 Mongo 调用.
    • 谢谢大卫。真的很感激洞察力。你的回答让我很开心。
    猜你喜欢
    • 2023-03-12
    • 2020-09-14
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多