如何使用Q.all()与复杂的承诺数组?

时间:2013-08-09 18:35:53

标签: node.js q

考虑我有一系列对象和承诺,例如:

[{
    a: 1
}, {
    a: 4
}, {
    a: 4
}, {
    promiseSend: [Function],
    valueOf: [Function]
}, {
    promiseSend: [Function],
    valueOf: [Function]
}]

现在,当调用I Q.all(arr)并返回then()中的对象值时,没有任何事情发生,我的数组仍包含promise对象。有没有办法使用Q.all()和这样一个复杂的数组?

1 个答案:

答案 0 :(得分:19)

Q应该如何工作。
要获得所有值,而不是承诺,您可以使用.spread()

Q.all([a, b]).spread(function (a, b) {
    return a + b;
});

spread()回调的每个参数都是每个承诺的结果,按顺序排列。

如果你认为你在这样的数组中有很多的承诺,那么循环通过then()中提供的参数并用它的值替换promises:

Q.all(promises).then(function(result) {
    for (var i = 0, len = result.length; i < len; i++) {
        if (Q.isPromise(result[i])) {
            result[i] = result[i].valueOf();
        }
    }

    // Next step!
});