2014-03-02 42 views
2

在一个函数,它已经内Meteor.binEnvironment,当我运行<collection>.find ({}),我得到的错误throw new Error ('Can \' t wait without a fiber '); 如果你把该呼叫也内Meteor.bindEnvironment(<collection>.find ({})),错误消息变成:throw new Error (noFiberMessage);Meteor.Collection与Meteor.bindEnvironment

有问题的功能通过Meteor.methods ({}) 我哪里错了?

实施例重现该错误:

Meteor.methods({ 
    "teste" : Meteor.bindEnvironment(function(){ 
    var Future = Meteor.require('fibers/future'); 
    var future = new Future(); 
    setTimeout(function(){ 
     return future.return(Sessions.findOne({})) 
    }, 15000); 
    console.log('fut', future.wait()); 
    }) 
}); 
+0

我不知道是否能解决您的实际问题,但在你的例子,没有必要使用'流星.bindEnvironment',只需使用'Meteor.setTimeout'而不是'setTimeout'('Meteor.setTimeout'将为你使用'Meteor.bindEnvironment')。 –

回答

1

使用Meteor._wrapAsync尝试来代替。

这是一个异步函数的例子,但任何其他会做:

var asyncfunction = function(callback) { 
    Meteor.setTimeout(function(){ 
     callback(null, Sessions.findOne({})) 
    }, 15000); 
} 

var syncfunction = Meteor._wrapAsync(asyncfunction); 

var result = syncfunction(); 

console.log(result); 

你可以换任何异步功能,使之同步和与它这样绑定纤维。

+0

我无法在我的项目中应用建议的解决方案,目前采用这种方式: 流星体方法(“teste”:Meteor.bindEnvironment(function(){){ var Fiber = Meteor.require('fibers')) ; VAR未来= Meteor.require( '纤维/未来'); VAR未来=新未来(); 的setTimeout(函数(){ 返回future.return( 光纤(函数(){ Sessions.findOne( {}); })。run() ); },15000); console.log('fut',future.wait()); }) }); – rogeriojlle

1

在我的项目,我不能申请推荐的解决方案,目前正在做的是这样的:

Meteor.methods({ 
    "teste" : Meteor.bindEnvironment(function(){ 
    var Fiber = Meteor.require('fibers'); 
    var Future = Meteor.require('fibers/future'); 
    var future = new Future(); 
    setTimeout(function(){ 
     return future.return(
     Fiber(function(){ 
      Sessions.findOne({}); 
     }).run() 
    ); 
    }, 15000); 
    console.log('fut', future.wait()); 
    }) 
}); 
相关问题