我如何在加载模板上设置最小超时功能

时间:2014-10-16 16:21:23

标签: javascript meteor timeout preload

我希望有一个加载模板,无论数据是否准备就绪,加载时间最短。所以基本上运行加载模板1秒,即使加载了模板和订阅?

我的路由器代码如下。

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading',
  waitOn: function() { return Meteor.subscribe('contacts'); }
});

Router.map(function() {
  this.route('acorn', {path: '/'});
});

Router.onBeforeAction('loading');

1 个答案:

答案 0 :(得分:2)

您可以通过将调用包装到Meteor.subscribe并为订阅实例的readystop方法编写passthrough来完成此操作。您的ready版本只会在经过一秒钟后返回true并且已完成包装订阅。

您的waitOn方法可能如下所示:

waitOn: function() {
    var sub = Meteor.subscribe("contacts");
    var dep = new Tracker.Dependency();
    var isSubReady = false;
    var hasWaitTimePassed = false;

    Meteor.setTimeout(function() {
        hasWaitTimePassed = true;
        dep.changed();
    }, 1000);

    Tracker.autorun(function() {
        isSubReady = sub.ready();
        dep.changed();
    });

    return {
        ready: function() {
            dep.depend();
            return hasWaitTimePassed && isSubReady;
        },
        stop: function() {
            sub.stop();
        }
    };
}

当然,如果你想在很多地方使用它,你需要将所有逻辑包装成一个可重用的函数,这样你就可以做到这样的事情:

waitOn: function() {
    return subscribeWithDelay("contacts", 1000);
}