为什么这个带超时的回调无法返回?

时间:2013-05-25 04:53:37

标签: javascript node.js callback

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中有一些我require的函数,我想传递一个redis对象来获取/设置一些数据,如果我结束的话可能会复制这个场景使用某种类型的回调。

有没有办法返回这个值?

2 个答案:

答案 0 :(得分: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()完成执行后的某个时间执行,因此它与two()的返回值无关

答案 1 :(得分:3)

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

您知道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。

还有其他很酷的模式可以帮助你解决这个问题。我真的很喜欢异步内容开始变得疯狂的承诺:

https://github.com/kriskowal/q