【问题标题】:Bluebird: getting the results of each()蓝鸟:获取每个()的结果
【发布时间】:2015-07-01 08:35:17
【问题描述】:

这是我对.each() 的不理解之处。该函数返回一个promise,它产生原始数组,而不是回调的结果数组。那你怎么得到结果呢? .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);
        }
    }
});

【问题讨论】:

    标签: node.js promise bluebird


    【解决方案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 并将结果累积到一个数组中(文档中的示例)。

    【讨论】:

    • 酷。 3.0 会很快发布吗?
    • @cleong petka 非常忙于处理 io.js 的事情,但我们希望这只是几周的事情。
    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 2016-06-04
    • 2015-07-08
    • 2019-10-19
    • 2015-02-13
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    相关资源
    最近更新 更多