如何捕获数组中的所有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); });