我是节点的新手,对回调有疑问。给出以下代码:
function wrapperFunction(x) {
var result = {};
asyncWrapperFunction(x, function(res) {
console.log(res); // successfully logs res
result[x] = res; // populates result
});
return result; // returns result before fully populated
}
function asyncWrapperFunction(x, callback) {
asyncFunction(x, function(err, res) {
if (err) return console.error(err);
return callback(res);
});
}
wrapperFunction(5);
调用wrapperFunction(5)
时,我能够在asyncWrapperFunction
调用中记录结果,但在请求完成之前返回result
,当然是未定义的。我知道为什么会这样。
问题是,在我的示例中填充result
的最佳做法是什么,只有在异步函数调用完成后才返回它?
答案 0 :(得分:0)
考虑到需要在其他地方使用异步函数,我的偏好是纯回调:
function asyncFunction(x, function(err, res) {
if (err) return console.error(err);
return callback(res);
});
}
function invokerFunction(x) {
var result = {};
asyncFunction(x, function(res) {
console.log(res); // successfully logs res
result[x] = res; // populates result
console.log(result);
continueWithProgram(result);
});
}
@ChrisC建议的承诺看起来更像是:
invokerFunction(x)
.then(continueWithProgram)