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

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

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

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

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


12 回复

promise.all ?好像可以


await Promise.all([
fetch(“url1”),
fetch(“url2”),
fetch(“url3”),
])

如果用包装好的包如 axios,可以用 axios.all([request1, request2, request3,…).then(axios.spread(response1, response2, response3) => {})。

promise.all

不是 Nodejs 不懂的问题,你应该多去学下 js,特别是 es6+的😄

1.回调嵌套
2.请求成功计数
3.promise.all

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
}

promise.all 建议里边包一层 promise,这样即使请求错误 promise.all 也不会挂掉往下走了

promise.allSettled 可解

估计也是 promise.all 里包一层 promise 的语法糖

用这个就好了,总有你想要的流程控制方式
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} 这里执行所有请求返回后的回调
});

在Node.js中,你可以使用Promise.all来并发请求多个数据接口,并在所有请求完成后汇总结果。以下是一个示例代码,展示了如何实现这一点:

const axios = require('axios');

// 假设你有多个API接口地址
const urls = [
  'https://api.example1.com/data',
  'https://api.example2.com/data',
  'https://api.example3.com/data'
];

// 并发请求数据接口
const fetchData = async (urls) => {
  try {
    const responses = await Promise.all(urls.map(url => axios.get(url)));
    const results = responses.map(response => response.data);

    // 汇总结果,这里简单地将结果合并为一个数组
    const汇总结果 = results.flat();

    return 汇总结果;
  } catch (error) {
    console.error('请求数据接口时发生错误:', error);
    throw error;
  }
};

// 调用函数并处理结果
fetchData(urls)
  .then(汇总结果 => {
    console.log('汇总后的结果:', 汇总结果);
  })
  .catch(error => {
    console.error('处理过程中发生错误:', error);
  });

在这个示例中,我们使用了axios库来发送HTTP请求。Promise.all接受一个包含多个Promise的数组,并返回一个新的Promise,该Promise在所有传入的Promise都成功完成时才会解析。我们使用map函数将每个URL转换为一个axios.get请求,然后使用Promise.all来并发执行这些请求。最后,我们汇总所有响应的数据并返回。

请确保你已经安装了axios库,可以通过运行npm install axios来安装。

回到顶部