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