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

dsp*_*099 2 javascript callback node.js

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));
Run Code Online (Sandbox Code Playgroud)

setTimeout中返回的结果是未定义的.我可以看到它为什么会发生,但我不知道如何避免它.

我有一些函数,我require在node.js,我想传递一个redis对象来获取/设置一些数据,如果我最终使用某种类型的回调,这可能会复制这种情况.

有没有办法恢复这个价值?

jfr*_*d00 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
};
Run Code Online (Sandbox Code Playgroud)

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

  • @mplungjan - 这不是我的第一句话和最后一句话吗? (3认同)