【问题标题】:Meteor.call returns undefined when returned from _.wrapAsync functionMeteor.call 从 _.wrapAsync 函数返回时返回 undefined
【发布时间】:2014-08-25 02:41:38
【问题描述】:

加载模板视图时,客户端向服务器发送Meteor.call('getPlayerScore') 以获取一些数据。

在服务器上,方法getPlayerScore 使用_.wrapAsync 执行一个同步函数client.zrevrangeSync,并在包装​​函数完成运行后返回1234 字符串。

问题: 为什么客户端收到resultundefined?如果在调用client.zrevrangeSync 之前返回result,则它不是未定义的,但如果从client.zrevrangeSync 内部返回,则它是未定义的。

Meteor.methods({

    getPlayerScore: function(playerId) {

        var client = redis.createClient(6379, redisServer)

        client.zrevrangeSync = Meteor._wrapAsync(client.zrevrange)
        client.zrevrangeSync(['players:' + playerId, 0, 3, 'WITHSCORES'], function(err, result) {
            return '1234'
        })
    }

})





Template.playerScoreboard.helpers({
    playerScore: function () {

        Meteor.call('getPlayerScore', 1, function (error, result) { 
            console.log('result: ', result)
            return
        });

    }
})

【问题讨论】:

  • 我不是 100% 知道 _wrapAsync 例程是如何工作的,但是方法本身不需要返回一些东西吗?

标签: javascript node.js meteor redis


【解决方案1】:

通常情况下,您不会给出回调并返回您获得的内容/除非它的咖啡脚本。

client.zrevrangeSync = Meteor._wrapAsync(client.zrevrange.bind(client));

return client.zrevrangeSync(['players:' + playerId, 0, 3, 'WITHSCORES']);

【讨论】:

  • 你能澄清一下回调是什么意思吗?顺便说一句,.bind() 是做什么的?我省略了它,它仍然可以完美运行!
  • bind 确保客户端的上下文与 client.zrevrange 正确绑定。有时它是一个问题,特别是如果该方法更嵌套。回调是 function(error, result) {..},因为它是异步的,所以无法返回方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2017-09-17
  • 2018-07-09
  • 2018-06-06
  • 2015-11-25
相关资源
最近更新 更多