如何捕获数组中的所有promise都被parsing的事件?

我正在使用Bluebird库与NodeJS(与SailsJS框架)

Promise.all()promises数组中的所有promises均被parsing时不捕获事件。

为了解决这个问题应该做些什么改变?

 var Promise = require("bluebird"); var request = require('request'); var http = require('http'); function searchMultiple(titles) { var results = []; return new Promise( function( resolveGlobal, rejectGlobal ){ var url = "http://xxx.xxx"; var promises = []; titles.forEach(function (title, index) { promises[index] = new Promise( function (resolve, reject) { var data = {"x":title}; request({ uri: url, method: "POST", body : data }, function(error, response, body) { return resolve(body) } } }, function (error, response, body) { console.log("error"); return resolve(); } ); }) }) Promise.all(promises).then(function(combinedResults) { console.log("successfully resolved all promises"); return resolveGlobal(combinedResults); }).catch(function (reason) { console.log("error"); return rejectGlobal(); }); }) } 

您不需要return resolve(value) ,因为它应该只resolve给定的结果值。

在你的searchMultiple函数中也没有理由创build新的promise,因为Promise.all返回一个promise。 你应该回报你已经有的承诺!

resolveGlobal()因此是不必要的,你可以直接return结果,因为then会把它作为parsing值包装起来。

你所有的代码都可以被重写为两个非常简单的函数

 function searchMultiple(titles) { //Empty array of promises var promises = []; var url = "http://xxx.xxx"; //Get a promise for each title and push to array titles.forEach(function(title){ promises.push(getData(title, url)); }); //Wait for all promises to resolve, and return the result return Promise.all(promises) .then(function(arrayOfResults){ //If this only shall return the array, this can be omitted aswell as the catch! return arrayOfresults; }) .catch(function(reason){ //Handle errors }); } function getData(title, url){ return new Promise(function(resolve, reject){ var data = {"x":title}; request({ uri: url, method: "POST", body : data }, function(error, response, body) { resolve(body) } } }, function (error, response, body) { console.log("error"); //Consider rejecting here instead since you'll get a result that is 'undefined' resolve(); }); }); } 

您应该考虑拒绝error handling程序中的承诺,而不是使用未定义的值解决此问题。 如果您得到的结果数组返回的值undefined ,则可能最终导致进一步的错误。

尝试这个:

 var Promise = require('bluebird'); var request = require('request'); function searchMultiple(titles) { return new Promise(function (resolveGlobal, rejectGlobal) { var url = 'http://xxx.xxx'; var promises = []; titles.forEach(function (title) { promises .push(new Promise(function (resolve, reject) { var data = { 'x': title }; request({ uri: url, method: 'POST', body: data }, function (error, response, body) { if (!error && response.statusCode == 200) { return resolve(body); } return reject(error); }); })); }); Promise .all(promises) .then(function (combinedResults) { console.log('successfully resolved all promises'); return resolveGlobal(combinedResults); }) .catch(function (error) { console.log('error'); return rejectGlobal(error); }); }); } 

和通话function:

 searchMultiple([...]) .then(function (results) { console.log(results); }) .catch(function (error) { console.log(error); });