有人可以解释Meteor.defer()的工作原理吗?

时间:2015-07-23 05:41:16

标签: meteor

所以... Meteor.defer(function(){ // stuff })不在文档中:

https://github.com/meteor/meteor/issues/2176

this链接似乎表示它只是等同于

Meteor.setTimeout(function(){ // stuff }, 0);

如果是这样的话,这怎么办,嗯,什么?它基本上说"等待0毫秒,然后运行功能"。

所以...它立即运行该功能。

我在这里缺少什么?这有点像Tracker.afterFlush还是什么?它是否以某种方式等待"事情" (什么样的东西?)在跑步前完成?

2 个答案:

答案 0 :(得分:18)

我看到Meteor.defer()很多关于SO被用作hack的在dom(有点)加载后运行的添加辅助方法 - 基本上是为了获得相同的效果作为Template.foo.rendered方法中的运行代码。

然而,Meteor.defer的主要(和最佳)用途是以异步方式运行 任务。

我们说我们有一个应用程序,我们正在发送电子邮件。在服务器上,可能需要几秒钟才能在流星方法内部进行处理,从而大大降低应用程序的运行速度。但是,如果您将此流程包装在{{1>} 电子邮件处理不会阻止执行中,则电子邮件仍然会发送(当它有机会时,不会立即发送),但所有内容都会运行更快,因为下面的代码不会等待。关于在Bulletproof Meteor延迟执行,有一个很好的示例课程。

您实际上可以使用Meteor.defer获得相同的效果 - 如果您的功能较慢,可以将其包装在setTimeout(f,0)中,其余代码将完成,并且'推迟'超时过程缓慢,所以虽然它看起来不像,setTimeout确实有一个非常有用的目的!

要查看此操作的示例here's a fiddle,请打开控制台,并观看“foo'日志。

答案 1 :(得分:-1)

由于异步回调,我在项目中遇到了一些问题。在onCreated内部我正在制作服务器Meteor.call并在 reactiveVar 中设置响应。我正在onRendered内部用 reactiveVar 做一些事情。每次 reactiveVar 显示未定义

所以我在Meteor.defer(function(){...})内使用了onRendered,这解决了我的问题。

以下是使用和不使用Meteor.defer()

的演示
Template.myTemplate.onCreated(function () {
    var instance = this;
    instance.myTemplateModel = new ReactiveDict();

    Meteor.call('all-user', function(err, res){
        if(res){
            console.log('inside callback');
            instance.myTemplateModel.set('users', res);
        }
    });
});

Template.myTemplate.onRendered(function () {
    var instance = this
    console.log('rendered start');
    Meteor.defer(function(){
         console.log(instance.myTemplateModel.get('users'));
    });
    console.log('render end');
});

控制台:

/*Without Meteor.defer()*/         |  /*With Meteor.defer()*/
render start                       |  inside callback
undefined                          |  render start
render end                         |  render end
inside callback                    |  [Object, Object, Object]