Javascript 节点回调填充对象

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

我是node的新手,对回调有疑问。给定以下代码:

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对象。我不是说我对节点不熟悉吗?为什么要投否决票?