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

NodeJS: How to use Promise.all in order to execute a method once multiple requests are executed?

我有一个 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();

我不确定的是,如何在我正在使用的 NodeJS 代码中应用带有 Promise.all 的实现?如果我能以某种方式再次遍历 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,
    port: parsedURL.port,
    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,
      port: parsedURL.port,
      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();
   });
})