我在处理Meteor.call
回调时遇到困难。我定义了一个从服务器端检索值的函数;但是,它不会将它们返回到模板,以便使用{{#each}}
循环对它们进行循环。
以下是功能:
search: function() {
Meteor.call('mySearchFunction', arg1, function(err, res) {
if (err) console.log(err);
else if(res) {
console.log(res);
return res;
}
});
}
console.log(res)
向我显示了我需要的数据,这些数据是用mySearchFunction
正确获取的,但我无法将其传递给模板处理程序,尽管它是一个可以迭代的数组。所以我尝试了以下方法:
search: function() {
var s = Meteor.call('mySearchFunction', arg1, function(err, res) {
if (err) console.log(err);
else if(res) {
console.log(res);
return res;
}
});
console.log(s);
return s;
}
并且console.log(res)
继续显示必要的数据,然而console.log(s)
显示为undefined
。我认为这是因为流星的异步特性在res
获得服务器端评估的机会之前返回s
。不管怎样,我都无法从存储在helper函数中的helper返回数据,这很奇怪。
在客户端上,Meteor.call
是异步的——它返回undefined
,其返回值只能通过回调访问。另一方面,帮助程序是同步执行的。请参阅此问题的答案,了解如何从助手调用方法。这里有一个快速解决方案:
$ meteor add simple:reactive-method
Template.showPost.helpers({
search: function () {
arg = Session.get('currentSearch');
return ReactiveMethod.call('mySearchFunction', arg);
}
});
我不确定你原来的文章中arg1
是什么,所以我在解决方案中使用了一个会话变量,但这应该会让你走上正轨。
这个包的问题是,它可能会鼓励不良行为,但对于不改变状态的方法调用(如搜索)来说,它应该是可以的。
另请参阅本文中关于助手的部分。