【问题标题】:can't pass function to call(method)无法将函数传递给调用(方法)
【发布时间】:2015-05-04 07:21:16
【问题描述】:

我正在尝试将函数作为参数传递,但由于某种原因这不起作用。在调试时,我最终遇到了这种情况:

使用服务器/twitter.js:

Meteor.methods({
  mytweets: function(callback){
    //someday I'll asynchronously get some tweets, then callback.
    console.log("server got callback=",callback)
  }
})

这行得通:

在/client/views/twitter.js:

Template.twitter.created = function(){
  Meteor.call("mytweets",123);
}

这会正确记录server got callback=123,此时一切正常。但是以下方法不起作用:

这行不通。为什么?

Meteor.call('mytweets', function(){
  return 123;
})

传递函数时,输出为server got callback= undefined

知道为什么吗?

注意:我是新的流星和 javascript,所以我真的不知道(还)这是否更多是 javascript 或与流星相关的问题。我会标记两者以防万一。

提前致谢!!

【问题讨论】:

  • 函数不可序列化,也不能作为参数传递给方法调用。文档Meteor.call中提到了

标签: javascript meteor functional-programming


【解决方案1】:

根据Meteor.call 文档,Meteor.call 期望EJSON-able Objects 作为参数,最后是一个回调,它不会传递给方法本身。这就是为什么mytweets 不接收您的回调作为参数,但123 接收。

如果mytweets 应该是异步的(服务器端),则必须使用 Meteor 插件。为此请查看meteor-sync-methods。

【讨论】:

    【解决方案2】:

    Meteor.call('method') 主要用于从客户端调用服务器方法,因此不能真正传递回调方法。 Meteor.call() 的最后一个参数是异步回调。因此,一旦方法调用完成,这将被调用,这就是您可以将其取回的方式。您可以返回数据,并将其作为结果对象传递。

    // On client
    Meteor.call('methodName', input1, input2, function (error, result) {
        if (error) {
           // Handle error
        }
        console.log(result.data);
    });
    
    // On server
    Meteor.methods({
        methodName: function (input1, input2) {
            // Do stuff.
           return {status: success, data: 'something here'};
        }
    });
    

    【讨论】:

    • 我明白你在做什么,但是如果 Do stuff 本身就是一个异步函数呢?我最初的想法是在服务器端执行异步get,以便在完成后在页面上显示结果。但也许这不是你用流星做的方式?
    • 我实际上是为此目的完成我的答案,请随时就它对您的情况的有用性给我任何反馈
    • 如果Do Stuff 是异步的,那么您可以使用Meteor.wrapAsync docs.meteor.com/#/full/meteor_wrapasync。你可以在这里看到这篇文章的一个例子:stackoverflow.com/questions/26226583/…
    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多