web-dev-qa-db-ja.com

複雑なpromiseの配列でQ.all()を使用するにはどうすればよいですか?

次のようなオブジェクトとpromiseの配列があるとします。

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

これで、I Q.all(arr)を呼び出してthen()にオブジェクト値を返すと、何も起こらず、配列にはpromiseオブジェクトが含まれます。 Q.all()やそのような複雑な配列を操作する方法はありますか?

12

それがQが機能することになっている方法です。
promiseではなくすべての値を取得するには、.spread()を使用できます。

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

spread()コールバックの各引数は、各promiseの結果になります。

このような配列に多くの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!
});
_
19
gustavohenke