提问者:小点点

NodeJS:如何使用Promise.All以便在执行多个请求时执行一个方法?


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

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

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

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

下面给出了用于从单个endpoint检索数据的代码,如果成功,我将执行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数组,将承诺存储到另一个responsepropors数组中,并仅在返回所有响应时执行successMethod将是理想的。


共1个答案

匿名用户

你可以等待所有的承诺,这确保所有的承诺都得到了回报。

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();  
})