我遇到了wrapAsync +方法+会话的问题。
如何正确实现WrapAsync? 我想在模板中知道用户是否至少有一个由他创建的项目。然后定义他是否可以创建另一个项目。
现在我收到了这个错误:
W20141013-15:04:43.237(-3)? (STDERR) Error: Can't wait without a fiber
但是,我找不到Fiber at Documentation。为了实现这一点,它真的有必要吗? 在客户端,我想要类似的东西:
//pagina.js
Template.pagina.helpers{
userHasItem: return Session.get('userHasItem');
}
//pagina.js
Meteor.call('userHasItem', Meteor.userId(), function (error,result) {
Session.set('userHasItem', result);
});
//在服务器端:
if(Meteor.isServer){
Meteor.startup(function () {
var userHasItemAsync = function (userId) {
setTimeout(function () {
if (Items.findOne({'userId': userId})) {
return true;
} else {
return false;
}
}, 4000);
};
Meteor.methods({
userHasItem: function(userId) {
var userHasItemSync = Meteor.wrapAsync(userHasItemAsync),
result;
try {
userHasItemSync(userId);
console.log(result);
return result;
}catch (e) {
console.log('erreur', e.message);
throw new Meteor.Error(500, e);
}
},
}
});
}
答案 0 :(得分:0)
无法根据现有代码重现错误。
仍然,userHasItemAsync不可用,因为您已在Meteor.startup函数中本地定义它。但在这种情况下你应该得到的错误是userHasItemAsync is undefined
。
此处输入的代码也有多处错误(我猜您在未从项目中复制/粘贴时输入):模板而非模板,模板在isClient之外定义(可能是& #39; s在一个可供客户使用的文件中)等等。因此,很难重现您的确切案例。
答案 1 :(得分:0)
无需调用服务器方法来查看该项是否存在(假设您已设置正确的发布/订阅),也无需调用wrapAsync。事实上,你想要实现的目标甚至不需要会话。所有代码都可以最终提炼到:
Template.pagina.helpers{
userHasItem: return Items.find({ userId: Meteor.userId() }).count() > 0;
}
Items.find返回的游标本身就是反应性的,因此不需要使用Session。