12

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

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

现在,当调用 IQ.all(arr)并返回 in 中的对象值时then(),什么都没有发生,并且我的数组仍然包含 promise 对象。有什么方法可以处理Q.all()这样一个复杂的数组吗?

4

1 回答 1

19

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

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

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

如果你认为你会在这样的数组中有很多 Promise,循环遍历提供的参数then()并用它的值替换 Promise:

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!
});
于 2013-08-09T20:18:19.250 回答