我有以下代码片段,它接受数据数组,对数组中的每个项目执行 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/