NodeJS:一旦执行多个请求,如何使用 Promise.all 来执行一个方法?

问题描述

我有一个 NodeJS 项目,其中有 N 个参数的数组,我需要调用端点 N 次(每个参数一次)。然后我需要在返回所有响应后进行监听,并且仅在检索到所有结果后才执行某个函数

我知道如何在前端框架中实现上述内容,其中我使用 axios,然后将 axios 的响应存储在一个数组中(例如 responsePromises),然后我正在执行>

return Promise.all(responsePromises).then(responses => { {
    //do something with the responses[0],responses[1],etc...
}

所以以上是我已经成功使用的东西。问题是,现在我需要在我的后端(我提到它是一个 NodeJS 项目)中做同样的事情。

下面给出了我用于从单个端点检索数据的代码,如果成功,我将执行 successMethod

let paramArray = ["one","two","three"];
let parsedURL = url.parse("https://this-is-my-url.com?param=" + paramArray[0]);
let proto = reqUrl.indexOf('https://') === 0 ? https : http;

let request = proto.get({ 
    hostname: parsedURL.hostname,port: parsedURL.port,path: parsedURL.path
},(response) => {
    //do something on success
    successMethod(); 
})
request.on('error',(e) => {
    //do something on error
    errorMethod(); 
});
request.end();

我不确定的是,如何在我正在使用的 Promise.all 代码中应用带有 NodeJS 的实现?如果我能以某种方式再次循环遍历 paramArray 数组,将 promise 存储到另一个 responsePromises 数组并仅在返回所有响应时执行我的 successMethod,那将是理想的。

解决方法

您可以 await 全部承诺,以确保所有承诺都已返回。

proto.get({ 
    hostname: parsedURL.hostname,port: parsedURL.port,path: parsedURL.path
},async(response) => {
    //make responsePromises array
    
    const res = await Promise.all(responsePromises);

    //do something on success
    successMethod(); 
})

评论后编辑:

const responsePromises = paramArray.map(i=>{
  let parsedURL = url.parse("https://this-is-my-url.com?param=" + i);
  let proto = reqUrl.indexOf('https://') === 0 ? https : http;
  
  const request =  proto.get({ 
    hostname: parsedURL.hostname,path: parsedURL.path
  });
  
  request.on('error',(e) => {
    //do something on error
    errorMethod(); 
  });
  
  return request;
})

Promise.all(responsePromises).then(responses => {
   successMethod();  
})
,

这是我的问题的解决方案:

let responsePromises = [];
paramArray.forEach(i=>{
  const myPromise = new Promise((resolve,reject) => {
    let parsedURL = url.parse("https://this-is-my-url.com?param=" + i);
    let proto = reqUrl.indexOf('https://') === 0 ? https : http;
  
    const request =  proto.get({ 
      hostname: parsedURL.hostname,path: parsedURL.path
    },(response) => {
      resolve(response);
    })
  
    request.on('error',(e) => {
      reject(e);
    });

    request.end();
  });
  responsePromises.push(myPromise);
})

Promise.all(responsePromises).then(responses => {
   responses.forEach(response => {
     successMethod();
   });
})