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对象来获取/设置一些数据,如果我结束的话可能会复制这个场景使用某种类型的回调。
有没有办法返回这个值?
答案 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。
还有其他很酷的模式可以帮助你解决这个问题。我真的很喜欢异步内容开始变得疯狂的承诺: