如何使用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! });