如何使用Q.all()与复杂的承诺数组?
考虑我有一个对象和承诺的数组,如:
[{ a: 1 }, { a: 4 }, { a: 4 }, { promiseSend: [Function], valueOf: [Function] }, { promiseSend: [Function], valueOf: [Function] }]
现在,当调用I Q.all(arr)
并在then()
返回对象值时,什么都不会发生,而且我的数组仍然包含promise对象。 有没有什么办法与Q.all()
和这样一个复杂的数组?
这就是Q应该如何工作。
要获得所有的值,而不是承诺,可以使用.spread()
:
Q.all([a, b]).spread(function (a, b) { return a + b; });
spread()
callback函数的每个参数将按照每个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! });