Подтвердить что ты не робот

Как использовать Q.all() со сложным массивом promises?

У меня есть массив объектов и promises, что-то вроде:

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

Теперь, когда вызов я Q.all(arr) и возвращает значение объекта в then(), ничего не происходит, и мой массив содержит объекты обещания. Есть ли способ работать с Q.all() и такими сложными массивами?

4b9b3361

Ответ 1

То, как Q должно работать.
Чтобы получить все значения, а не promises, вы можете использовать .spread():

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

Каждый аргумент обратного вызова spread() будет результатом каждого обещания в его порядке.

Если вы думаете, что у вас будет много promises в таком массиве, перейдите через аргумент, предоставленный в 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!
});