1

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

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

4

2 回答 2

2

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

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

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

否则,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);
        });
    });
}
于 2013-01-16T23:53:29.233 回答
2

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

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

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

于 2013-01-17T01:51:29.990 回答