多个流星集合的插入顺序

Order of inserts to multiple meteor collections

我在一个基本的 meteor 应用程序中看到意外行为,导致我想提出一个设计模式问题以征求意见。

meteor 应用程序有一个服务器,它从外部源读取图形节点和边的列表,将节点插入到 Nodes 集合,将边插入到 Edges 集合,然后将特殊文档插入第三个信号采集。客户端在所有三个集合上都有 "added:" 个观察者来检测变化。

我希望在绘制信号命令之前在客户端上看到所有节点和链接。相反,我看到大约 1/3 的节点和边缘在客户端的信号命令之后被添加。

我想避免在所有数据都存在之前绘制图形,因此使用信号集合。在 Meteor 中有更好的方法吗?我应该使用不同的设计模式吗?看来这应该是一个常见的问题。

// server side inserts
_.each(model.nodes, function(r) {
    Nodes.insert({ name: r.name });
});
_.each(model.edges, function(r) {
    Edges.insert({ source: r.src, target: r.tgt, value: r.value });
});
Signal.remove({});
Signal.insert({command: "draw-graph"});


// client side observer
Template.template_mission_impact.rendered = function () {
    var graph = new myGraph(...);

    Nodes.find().observe({
        added: function (doc) {
            graph.addNode(doc._id, doc.name);
        }
    });
    Edges.find().observe({
        added: function (doc) {
            graph.addEdge(doc._id, doc.source, doc.target, doc.value);
        }
    });
    Signal.find().observe({
        added: function (doc) {
            if (doc.command === "draw-graph") {
                graph.draw();
            }
        }
    });
};

架构看起来不错,只需使用模板订阅并将您的模板包装在#subscriptionsReady 助手中。这样做时,呈现的回调将 运行 直到所有文档都在那里。

一般来说,图网络会变得非常大非常快,大约 10000 个文档订阅后会明显变慢。如果您的数据不需要反应性,则消除它(发布获取,而不是观察)可以大大提高速度。