蓝鸟:获取每个()的结果

Bluebird: getting the results of each()

关于 .each(),我有一些不明白的地方。函数 returns 产生原始数组而不是回调结果数组的承诺。那你怎么得到结果呢? .map() 不是我要找的,因为元素需要按顺序处理。

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

在示例中,causeSideEffect() returns 一个布尔值的承诺,表明它是否做了任何事情。

编辑:产生 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);
        }
    }
});

我们同意你的看法。事实上,我们非常同意您的看法,以至于这种行为在 3.0 中发生了变化(其中 3.0 将 return 修改后的数组)。

基本上,.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并将结果累加到数组中(文档中的示例)。