Nodejs 如何并发请求数据接口,并返回汇总后的结果?

2020-08-20 10:25:21 +08:00
 s609926202

我用 Nodejs 写了一个 API 接口,用于请求指定数据。这个接口会请求三个其他的 API:

  1. http://a.com/api1
  2. http://b.com/api2
  3. http://c.com/api3

我的目的是同时(并发)请求上面这三个 API,然后汇总请求到的结果,返回给客户端。
请问这个可以实现吗,对 Nodejs 不懂?

2888 次点击
所在节点    Node.js
11 条回复
hgjian
2020-08-20 10:26:55 +08:00
promise.all ?好像可以
flowfire
2020-08-20 10:31:09 +08:00
await Promise.all([
fetch("url1"),
fetch("url2"),
fetch("url3"),
])
c6h6benzene
2020-08-20 10:39:13 +08:00
如果用包装好的包如 axios,可以用 axios.all([request1, request2, request3,...).then(axios.spread(response1, response2, response3) => {})。
coderxy
2020-08-20 11:00:26 +08:00
promise.all
4196
2020-08-20 11:24:26 +08:00
不是 Nodejs 不懂的问题,你应该多去学下 js,特别是 es6+的😄
galikeoy
2020-08-20 12:42:42 +08:00
1.回调嵌套
2.请求成功计数
3.promise.all
buffzty
2020-08-20 15:48:46 +08:00
async ()=>{
const task1 = fetch1()
const task2 = fetch2()
const task3 = fetch3()
// try catch
const task1Resp = await task1
const task2Resp = await task2
const task3Resp = await task3
// logic
}
azcvcza
2020-08-20 15:58:17 +08:00
promise.all 建议里边包一层 promise,这样即使请求错误 promise.all 也不会挂掉往下走了
evilStart
2020-08-20 22:08:16 +08:00
@azcvcza promise.allSettled 可解
azcvcza
2020-08-21 14:06:45 +08:00
@evilStart 估计也是 promise.all 里包一层 promise 的语法糖
JaydenC
2020-09-21 11:52:45 +08:00
用这个就好了,总有你想要的流程控制方式
https://caolan.github.io/async/v3/docs.html#parallel



async.parallel([
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 200);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 100);
}
],
// optional callback
function(err, results) {
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
});

// an example using an object instead of an array
async.parallel({
one: function(callback) {
setTimeout(function() {
callback(null, 1);
}, 200);
},
two: function(callback) {
setTimeout(function() {
callback(null, 2);
}, 100);
}
}, function(err, results) {
// results is now equals to: {one: 1, two: 2} 这里执行所有请求返回后的回调
});

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/699845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX