流星发布/订阅竞争条件

时间:2015-06-09 19:07:35

标签: javascript mongodb meteor

我有一个定义发布/订阅行为的文件,但它只能运行10次。如果它不起作用,查询将返回未定义。我可以在chrome控制台中进行成功的查询,因此必须在查询触发后加载。

[project root] /lib/site.js

Articles = new Mongo.Collection("articles");
Authors = new Mongo.Collection("authors");

if (Meteor.isServer) {
    Meteor.publish("articles", function () {
        return Articles.find();
    });
    Meteor.publish("authors", function () {
        return Authors.find();
    });
}

if (Meteor.isClient) {
    Meteor.subscribe("articles");
    Meteor.subscribe("authors");
}

[project root] /client/modules/articleAdHelper.js

var getArticle = function (id) {
    var article = Articles.findOne({articleID: id});
    var author = Authors.findOne({_id: article.authorID});
    article.authorName = author.authorName;
    article.authorPageUrl = author.authorPageUrl;
    article.authorAvatar = author.authorAvatar;
    article.articlepublishTimePassedMessage = getPublishDateMessage(article.articlePublishDatetime);
    return article;
};

var getAdUnit = function (unitKey) {
    for (var i = 0; i < unitKey.length; i++) {
        unitKey[i] = getArticle(unitKey[i]);
    }
    return {
        m: [
            unitKey[0],
            unitKey[1]
        ],
        h: [
            unitKey[2],
            unitKey[3],
            unitKey[4],
            unitKey[5]
        ]
    }
};


var articleID = "testarticle";
var adUnitObj = getAdUnit([
    "testarticle",
    "claudeArticle",
    "emusk",
    "claudeArticle",
    "testarticle",
    "adCreatePageTest"
]);
Template.frontPageArticleAdUnit.helpers(adUnitObj);

1 个答案:

答案 0 :(得分:0)

根本问题在于您只调用getAdUnit一次,只有在调用时预订准备好后才能正常工作(如您所见)。我不清楚你是否想要一个非反应性的解决方案,所以我将提出两个选择:

<强>非反应性

如果您希望广告单元数据只生成一次(因此广告不会发生变化),那么您需要在呈现网页之前等待订阅。如果您使用的是铁路由器,则需要在路线上添加waitOn挂钩。

<强>反应性

如果广告单元数据可以更改,则您需要为助手返回函数,而不是单个调用产生的单个对象。这样,当作者和文章可供客户使用时,数据将更新。

我建议在流星中使用警卫阅读this post