所以... Meteor.defer(function(){ // stuff })
不在文档中:
https://github.com/meteor/meteor/issues/2176
但this链接似乎表示它只是等同于
Meteor.setTimeout(function(){ // stuff }, 0);
如果是这样的话,这怎么办,嗯,什么?它基本上说"等待0毫秒,然后运行功能"。
所以...它立即运行该功能。
我在这里缺少什么?这有点像Tracker.afterFlush
还是什么?它是否以某种方式等待"事情" (什么样的东西?)在跑步前完成?
答案 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]