如何解决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();
});
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。