节点回调填充对象

时间:2015-03-30 17:07:33

标签: javascript node.js asynchronous callback

我是节点的新手,对回调有疑问。给出以下代码:

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的最佳做法是什么,只有在异步函数调用完成后才返回它?

1 个答案:

答案 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)