javascript - 返回前从多个 HTTP GET 请求获取数据

标签 javascript node.js

我有以下代码片段,它接受数据数组,对数组中的每个项目执行 HTTP GET 请求,并在执行提供的回调方法之前将返回的数据加载到新数组中:

function(players, callbackMethod) { 
   var returnData = [];  
   players.forEach(function(item){
       var playerRequestUrl = baseUrl+'/'+platform+'/members/'+item.blazeId+'/stats';
       https.get(playerRequestUrl, function(res){
           res.on('data', function(chunk){
               var playerData = JSON.parse(chunk);
               returnData.push({"username":item.username, "data":playerData.raw[item.blazeId]});

               //callback here?                            
           });
       });
   });

}

本质上它需要一个像这样的对象数组:

[
    {
      "username":"user1",
      "blazeId":"guid1"
    },
    {
       "username":"user2",
       "blazeId":"guid2"
    }
]

并返回一个像这样的对象数组:

[
   {
      "username":"user1",
      "data": { /** response data **/ }
   },
   {
      "username":"user2",
      "data": { /** response data **/ }
   }
]

我遇到的问题是,我不知道如何调用提供的回调方法,以便代码在执行之前等待所有 http.get 操作完成。

怎样才能达到预期的效果?

最佳答案

您可以对所有请求使用Promise.all,这些请求一旦解决就会调用回调:

function getAllPlayers(players, callbackMethod) {
  Promise.all(players.map((item) => {
    const playerRequestUrl = baseUrl + '/' + platform + '/members/' + item.blazeId + '/stats';
    return new Promise((resolve) => {
      https.get(playerRequestUrl, function(res) {
        res.on('data', function(chunk) {
          const playerData = JSON.parse(chunk);
          resolve({
            "username": item.username,
            "data": playerData.raw[item.blazeId]
          });
        });
      });
    });
  }))
    .then(callbackMethod)
}

请注意,通过此实现,callbackMethod 应接受与您的 returnData 数组对应的一个参数。

关于javascript - 返回前从多个 HTTP GET 请求获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50224657/

相关文章:

用于迭代 css 类的 javascript 阅读更多链接工作

node.js - 如何使用 node.js 连接到 ElastiCache 集群

javascript - MongoDB 批量插入操作而不是 For 循环

javascript - 使用 Vanilla JS 克隆具有特定属性的元素

javascript - 需要响应式 iframe (div)/固定纵横比/水平和垂直居中/缩放本身,这样它就不会被浏览器裁剪

node.js - PM2 使用选项运行 nodejs sveltekit 应用程序

node.js - AWS Elastic Beanstalk - 找不到模块 "hapi"

javascript - JS如何获取特定格式的日期时间

javascript - JavaScript 中的 window.location.href 和 window.open() 方法

javascript - 在 JavaScript 中从一维数组返回二维数组