2015-04-23 96 views
2

这是我不明白的关于.each()的内容。该函数返回一个承诺,该承诺产生原始数组而不是回调结果数组。你如何得到结果呢? .map()不是我要找的元素,因为元素需要按顺序处理。Bluebird:得到每个的结果()

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

在这个例子中,causeSideEffect()返回boolean的承诺,表明它是否做了什么。

编辑:能产生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

我们同意你的垫片。事实上,我们非常同意你的看法,这种行为在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并将结果累加到一个数组(例如,在文档)。

+0

很酷。 Will 3.0会很快发布吗? – cleong

+1

@cleong petka超级忙,io.js的东西,但我们希望这是一个星期的问题。 –