【问题标题】:Return Value from Node Redis Command: Hubot and CoffeescriptNode Redis 命令的返回值:Hubot 和 Coffeescript
【发布时间】:2015-02-15 06:18:10
【问题描述】:

TL;DR 如何从client.ttl 回调中获取返回值,以便在getTTL 函数之外使用?

在这里使用 Hubot 和 Redis 学习 Coffeescript。我有一个函数没有返回我期望的值。此处的函数旨在获取 Redis 键的 TTL 并返回 TTL 值,例如4000(秒)。这是我的 Coffeescript:

getTTL = (key) ->
    client.ttl key, (err, reply) ->
        if err
            throw err
        else if reply in [-1, -2]
            "No TTL or key doesn't exist."
        else
            reply
    return

现在这里是用 JS 编译的:

var getTTL;

getTTL = function(key) {
  client.ttl(key, function(err, reply) {
    if (err) {
      throw err;
    } else if (reply === (-1) || reply === (-2)) {
      return "No TTL or key doesn't exist.";
    } else {
      return reply;
    }
  });
};

来自coffeescript return function callback acting strange,我了解需要添加空的return,但我仍然没有收到回调回复中的值。如果我将该函数与 Hubot 中的 Response object 集成,我可以执行 msg.send reply 并且可以很好地输出返回值。

但是,如果我将函数的返回值分配给变量,例如ttl_val = getTTL "some-key",然后我只返回一个布尔值 (true),我假设它是 getTTL 函数本身的退出状态。所以,我的问题是:

我做错了什么导致我无法在回调函数中接收回复值?我是否需要执行How do I wait for a callback in coffeescript (or javascript)? 之类的操作以确保我的回调在尝试拉取值之前完成?

【问题讨论】:

  • 我找到了使用不同方法解决我的核心问题的方法,但我仍然对我遇到的这个特殊问题感兴趣......

标签: javascript node.js coffeescript redis hubot


【解决方案1】:

你需要设置getTTL接受自己的回调函数:

getTTL = (key, done = ()->) ->
    client.ttl key, (err, reply) ->
        if err
            throw err
        else if reply in [-1, -2]
            done "No TTL or key doesn't exist."
        else
            done reply

然后在你的hubot脚本中

robot.respond /what is the TTL for (.*)/i, (msg) ->
    getTTL msg.match[1] msg.send

编辑:回答您是 tl;dr 编辑:您无法从回调中获取返回值。该值仅存在于回调函数的上下文中。您始终可以从回调函数内部将该值分配给某种全局变量,但是您永远不会知道该全局值何时被分配了它的值。

【讨论】:

  • 抱歉,如果我的问题有问题,请告诉我。我正在尝试存储从client.ttl 的回复返回的值,以用于另一个函数,完全在hubot 响应之外。但是,如果我将该功能与robot.respond 集成并执行msg.send,它就可以正常工作并将TTL 输出到控制台。这就是为什么我猜这个问题源于我自己(缺乏)对异步回调的理解......
  • @thankyour 回答您是 tl;dr 编辑:您无法从回调中获取返回值。该值仅存在于回调函数的上下文中。您始终可以从回调函数内部将该值分配给某种全局变量,但是您永远不会知道该全局值何时被分配了它的值。
  • 该死!这就是我害怕的......谢谢你的时间!如果您更改答案以反映,我会将您的答案标记为正确...
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2017-09-21
  • 1970-01-01
  • 2017-11-02
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多