蓝鸟:得到每个()的结果

时间:2015-04-23 09:06:34

标签: node.js promise bluebird

这是我对.each()无法理解的事情。该函数返回一个promise,它产生原始数组而不是回调结果数组。你如何得到结果呢? .map()不是我正在寻找的,因为元素需要按顺序处理。

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

在示例中,causeSideEffect()返回布尔值的promise,表示它是否执行了任何操作。

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

1 个答案:

答案 0 :(得分:3)

我们同意你的看法。事实上,我们非常同意你的观点,这种行为在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并将结果累积到数组中(文档中的示例)。