Bluebird: получение результатов каждого()

Вот что я не понимаю в .each(). Функция возвращает обещание, которое возвращает исходный массив вместо массива результатов обратного вызова. Как тогда получить результаты? .map() - это не то, что я ищу, поскольку элементы нужно обрабатывать по порядку.

var input = [1, 2, 3];
return promise.each(input, causeSideEffect).then(function() {
    /* return true if any side effect occurred */
});

В примере causeSideEffect() возвращает обещание логического значения, указывающее, сделал ли он что-нибудь.

РЕДАКТИРОВАТЬ: прокладка, которая дает поведение версии 3.0

var promise = require('bluebird');

var testInput = [ 1 ];
promise.each(testInput, function(){}).then(function(results) {
    if (results[0] === 1) {
        var originalFunction = promise.each;
        promise.each = function(array, callback) {
            var results = [];
            var closure = function(item, index, length) {
                return promise.resolve(callback(item, index, length)).then(results.push.bind(results));
            };
            return originalFunction(array, closure).return(results);
        }
    }
});

person cleong    schedule 23.04.2015    source источник


Ответы (1)


Мы согласны с вами. На самом деле мы полностью согласны с вами в том, что это поведение изменилось в 3.0 (где 3.0 вернет измененный массив).

По сути, .each не предполагалось использовать таким образом — ожидалось, что люди будут использовать .each только для побочных эффектов, а не для вещей, для которых они использовали бы .map.

До тех пор вы можете либо сделать накопление самостоятельно:

var input = [1, 2, 3], result = [];
return promise.each(input, causeSideEffect).then(function() {
    result.push(modificationHappened); // true or false
}).then(function(){
    // access result
}); 

Или используйте .reduce и соберите результат в массив (пример в документах).

person Benjamin Gruenbaum    schedule 23.04.2015
comment
Прохладно. Скоро ли выйдет 3.0? - person cleong; 23.04.2015
comment
@cleong petka очень занят io.js, но мы надеемся, что это вопрос нескольких недель. - person Benjamin Gruenbaum; 23.04.2015