在我的Node.js代码中,我需要进行2到3个API调用,每次都会返回一些数据。在完成所有API调用之后,我希望将所有数据收集到一个JSON对象中,以便发送到前端。
我知道如何使用API回调(下一次调用将发生在前一个调用的回调中),但这会很慢:
//1st request
request('http://www.example.com', function (err1, res1, body) {
//2nd request
request('http://www.example2.com', function (err2, res2, body2) {
//combine data and do something with it
});
});
我知道你也可以用promises做一些类似的、更整洁的事情,但我认为同样的概念也适用于下一个调用直到当前调用结束才会执行的情况。
有没有一种方法可以同时调用所有函数,而不是让我的最后一段代码等待所有API调用完成并在执行之前提供数据?
发布于 2015-09-29 07:03:45
如果你想使用异步的话,听起来async.parallel()也可以做这件事:
var async = require('async');
async.parallel({
one: function(parallelCb) {
request('http://www.example1.com', function (err, res, body) {
parallelCb(null, {err: err, res: res, body: body});
});
},
two: function(parallelCb) {
request('http://www.example2.com', function (err, res, body) {
parallelCb(null, {err: err, res: res, body: body});
});
},
three: function(parallelCb) {
request('http://www.example3.com', function (err, res, body) {
parallelCb(null, {err: err, res: res, body: body});
});
}
}, function(err, results) {
// results will have the results of all 3
console.log(results.one);
console.log(results.two);
console.log(results.three);
});
发布于 2017-07-01 03:16:08
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
ES6现在包含了Promise.all,所以你根本不需要任何第三方的库。
"Promise.all等待所有完成(或第一次拒绝)“
我在https://gist.github.com/rainabba/21bf3b741c6f9857d741b69ba8ad78b1上设置了一个要点,用重构迭代来演示Promise.all()
我使用的是一个IIFE (立即调用的函数表达式)。如果你不熟悉,你会想要看下面的例子,尽管要点展示了如何使用IIFE。https://en.wikipedia.org/wiki/Immediately-invoked_function_expression
TL;DR
( function( promises ){
return new Promise( ( resolve, reject ) => {
Promise.all( promises )
.then( values => {
console.log("resolved all promises")
console.dir( values );
resolve( values.reduce( (sum,value) => { return sum+value }) ); //Use Array.prototype.reduce() to sum the values in the array
})
.catch( err => {
console.dir( err );
throw err;
});
});
})([
new Promise( ( resolve, reject ) => {
console.log("resolving 1");
resolve( 1 );
}),
new Promise( ( resolve, reject ) => {
console.log("resolving 2");
resolve( 2 );
})
]).then( sum => { console.dir( { sum: sum } ) } )
发布于 2021-05-19 20:23:24
我有一个类似的用例,我必须做10个并发调用。我是用async/await
和Promise.all
的组合来实现的。
async function getData() {
try {
let result = null
const ids = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
let promises = ids.map(async (id) => {
return fetch(
`https://jsonplaceholder.typicode.com/todos/${id}`
).then((data) => data.json());
});
result = await Promise.all(promises)
return result
} catch(err) {
console.log("error: ", err)
}
}
getData().then(data => console.log(data))
https://stackoverflow.com/questions/32828415
复制相似问题