使用promise为数组中的每个元素执行一个函数

时间:2016-10-05 10:39:00

标签: node.js promise

我需要使用promise为数组中的每个项执行一个函数。我希望promise.all适合这个。但是,其余的函数执行应当在(函数执行)数组中的任何项目因错误而终止时继续执行。 promise.all是这样做的吗?

示例:在下面的代码片段中,需要为每个项parallely执行函数getInfo,并且当getInfo(item1)的结果在可用时返回时,无需等待结果可用于item2&项目3。此外,任何项目的错误都不应影响数组中其余项目的执行

var arrayIterate = [item1, item2, item3]

function getInfo(item){
  // do stuff
};

2 个答案:

答案 0 :(得分:1)

不是promise.all以这种方式行事。但是你可以通过回调手动链接函数。

就像这样

for(i=0;i<arr.length;i++){ myFunction('param1', function(){ }); }

myFunction(param1, callback){ if(error){ callback() }else{ //do something and then callback() } }

就像这样,即使您的代码出现错误,它也不会在该点停止,但会对数组中的所有元素执行。

PS:但是请记住for loop不应该在这里使用,因为它不会等待回调。因此,使用递归技术对数组的每个元素执行函数执行。

答案 1 :(得分:1)

Promise.all()非常适合这种情况。

假设您有一个网址列表,并且您希望从这些网址中获取数据。

var request = require('request-promise') // The simplified HTTP request client 'request' with Promise support. Powered by Bluebird.

var Promise = require('bluebird');

var urls = ["a-url", "some-other-url"];

var promises = [];

// You create the promise for each url and push them in an array

urls.forEach(function(url){
    promises.push(request.get(url));
});

// After that you can call the Promise.all() on this promises array and get the results.

Promise.all(promises).then(function(results) {
    // results is an array of results from all the urls

    // No error encountered

    // Celebrate victory

}).catch(function(err) {
    // Even if one error occurs, it will come here and won't execute any further.
    // Handle error 

});

您甚至可以选择Promise.map()

继续阅读Bluebird文档:http://bluebirdjs.com/docs/getting-started.html