当前位置: 首页 > 知识库问答 >
问题:

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

尹超
2023-03-14

我有一个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个答案

卫沈义
2023-03-14

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

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();  
})
 类似资料:
  • 问题内容: 我正在使用python的urllib2库向特定主机发出多个http请求。每次发出请求时,都会创建新的tcp和http连接,这会花费大量时间。有什么办法可以使用urllib2保持tcp / http连接的活动? 问题答案: 如果切换到httplib,则可以更好地控制基础连接。 例如: 这将在相同的基础TCP连接上发送2个HTTP GET。

  • 问题内容: 使用node.js时,我希望以每次仅运行10个(或n个)的方式访问多个远程URL。 如果本地发生异常(m次),我也想重试一个请求,但是当状态代码返回错误(5XX,4XX等)时,该请求将视为有效。 这对我来说真的很难缠住我的头。 问题: 无法尝试捕获http.get,因为它是异步的。 需要一种在失败时重试请求的方法。 我需要某种信号量来跟踪当前活动的请求计数。 当所有请求完成时,我想在列

  • 问题内容: 我有以下查询,希望在单个选择请求中运行: 问题在于,所有内容都是通过单独的多个查询获取的。我只希望在单个请求中获取团队和团队的球员以及每个球员的技能。但是取而代之的是,我有多个选择查询来获取每个球队,每个球员,每个球员的数据和技能。 以下是带有给定注释的实体: 游戏实体: 团队实体: 玩家实体: 您能指出犯下的错误吗?我需要一个选择查询来加载游戏,它是团队,团队的球员和每个球员的技能。

  • 我们有一个场景,每个Cassandra中给定,对于下面的架构: 单个 POST 请求正文包含多个值的详细信息。这将触发单个表上每个 POST 请求的多个插入。 每个INSERT查询如下所示执行: 1个 Cassandra是否确保每个POST请求在单个表上的多个插入上的数据展示一致性?每个POST请求都在Go例程(线程)上处理。后续GET请求应确保检索一致的数据(通过POST插入) 使用批处理语句在

  • 问题内容: 我有一个javascript函数,其中有两个$ .post请求。两个$ .post请求都应该执行。但是有时候,第二个$ .post请求却没有执行。这可能是什么原因? 问题答案: 是$ .ajax()结构的缩写形式。我通常更喜欢使用该结构,因为: 比较容易发现我是否错过了任何事情 我可以更轻松地添加其他参数,例如 当刚接触ajax时,我发现对这种结构进行故障排除要容易得多 在您的情况下,

  • 问题内容: 说我想做,如何在同一个mysql_query()中做它们? 编辑: 由于这个问题有很多看法,我想指出,自PHP 5.5起,其他功能现在已被弃用,不应使用。 问题答案: 我从来没有尝试过,但是我认为您可以使用mysqli :: multi_query 。拒绝多条语句的好处之一是,它可以立即排除一些更常见的SQL注入攻击,例如添加一条语句。因此,您可能需要注意多个语句。