2
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 内的返回结果未定义。我有点明白为什么会发生这种情况,但我不知道如何避免它。

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

有没有办法返回那个值?

4

2 回答 2

5

它的内部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
};

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

于 2013-05-25T05:04:17.747 回答
3

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

你知道那是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

于 2013-05-25T05:47:55.253 回答