Javascript 节点回调填充对象
我是node的新手,对回调有疑问。给定以下代码:Javascript 节点回调填充对象,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我是node的新手,对回调有疑问。给定以下代码: function wrapperFunction(x) { var result = {}; asyncWrapperFunction(x, function(res) { console.log(res); // successfully logs res result[x] = res; // populates result }); return result; // r
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
在请求完成之前返回,当然是未定义的。我知道为什么会这样
问题是,在我的示例中,填充
结果并仅在异步函数调用完成后返回它的最佳实践是什么?如果需要从其他地方使用异步函数,我首选纯回调:
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)
无法混合使用异步和同步调用。您必须在回调命中后的某个时间处理所有结果逻辑。最佳实践是使用promise对象。我不是说我对节点不熟悉吗?为什么要投否决票?