【问题标题】:Why does this callback with a timeout fails to return?为什么这个超时回调无法返回?
【发布时间】:2013-05-25 04:53:37
【问题描述】:
function one(num, callback) {
  return callback(num);
};

function two(num) {
  // return num + 99; << this works
  setTimeout(function() { return num + 99; }, 1000); // << this doesn't
};

console.log(one(55, two));

setTimeout 内的返回结果未定义。我有点明白为什么会发生这种情况,但我不知道如何避免它。

我在 node.js 中有一些我是 requireing 的函数,我想将一个 redis 对象传递给它们以获取/设置一些数据,如果我最终使用它可能会复制这种情况某种回调。

有没有办法返回那个值?

【问题讨论】:

  • two 函数是异步的,无论如何都不会返回任何内容...return num + 99; 您从该匿名函数返回,这是毫无意义的
  • 因为它是异步的。这就是它的工作原理。函数二立即返回,然后一秒钟后返回 num + 99 运行

标签: javascript node.js callback


【解决方案1】:

setTimeout() 的内部调用了您的匿名函数 function() { return num + 99; },因此该函数的返回值进入 setTimeout() 内部,并被忽略。

two()函数没有返回值,所以当one()返回调用two()的返回值时,该返回值为undefined

注意这里two()函数体内没有返回值:

function two(num) {
  // return num + 99; << this works
  setTimeout(function() { return num + 99; }, 1000); // << this doesn't
};

传递给setTimeout() 的匿名回调中的return 语句在two() 完成执行后的一段时间后执行,因此它与two() 的返回值无关。

【讨论】:

  • 或许能详细说明匿名函数内部返回的无效性?
  • @mplungjan - 这不是我的第一句话和最后一句话吗?
【解决方案2】:

所以听起来你明白发生了什么,但只是不清楚如何处理它?

您知道two 无法返回。很明显,如果two 不能返回,那么one 也不能返回。

所以剩下要做的就是拥抱它,并在堆栈中一直保持异步:

function one(num, doWork, callback) {
  doWork(num, callback);
};

function two(num, callback) {
  setTimeout(function() { callback(num + 99); }, 1000);
};

one(55, two, function (result) { console.log(result); });

所以return 一直向下变为callback。注意有多少 Node API 采用这种形式:

action(args, function (errorMessage, successMessage) {});

即使它们是同步的。这让他们可以轻松地使用异步 API。

当它变得很麻烦时,还有其他很酷的模式可以帮助您处理这个问题。当异步的东西开始变得疯狂时,我真的很喜欢 Promise:

https://github.com/kriskowal/q

【讨论】:

  • 你是哥谭需要但不配的英雄
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
相关资源
最近更新 更多