Meteor.call()回调未向模板返回值



我在处理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是什么,所以我在解决方案中使用了一个会话变量,但这应该会让你走上正轨。

这个包的问题是,它可能会鼓励不良行为,但对于不改变状态的方法调用(如搜索)来说,它应该是可以的。

另请参阅本文中关于助手的部分。

最新更新