因此,我目前正在从提供此类响应的API中提取信息。
{
"meta": {
"limit": 20,
"next": null,
"offset": 0,
"previous": null,
"total_count": 10
},
"objects": [
{
"date": "2019-03-15",
"id": 16,
"mSlug": "gud_vs_dex",
"resource_uri": "/api/v1/match/16/",
"team1": "/api/v1/team/7/",
"team2": "/api/v1/team/3/",
"time": "21:30:00",
"viewLink": "twitch.tv/tectalparrot198q",
"viewLink2": null
},
然后,我需要能够从此响应中获取五个字段-mSlug
,team1
,team2
,date
和time
。我很容易得到mSlug
,date
和time
。但是,问题是我需要使用从team1
和team2
返回的链接来进行新的GET请求,这些请求返回的API类似于:
{
"captain": "Parrayeet",
"currentRanking": 100,
"id": 7,
"members": "CFE SilentHeart,GreenTigerBeast,Pack Jaul",
"name": "Guardian Down",
"platform": "Xbox",
"resource_uri": "/api/v1/team/7/",
"slug": "guardian_down"
}
从这里,我需要能够获取我要搜索的团队的名称。最后,最后,我需要能够汇总来自所有调用的信息,以形成一个字符串,告诉用户团队的名称(来自第二个/第三个调用)以及来自第一个调用的日期/时间/链接呼叫。但是,由于请求是异步的,因此我无法将这些结果保存到任何变量或数组中,因此不能简单地执行
slug = response.body.objects[0].mSlug
是否有什么好方法可以发出多个GET请求,有的使用响应的信息,最后将数据连接在一起?我尝试使用fetch
,request
和request-promise
,但无济于事。任何帮助(以及有关其工作原理的解释)都将有所帮助。
答案 0 :(得分:0)
您可以像这样链接您的诺言:
rp(options)
.then(function (body) {
idk(body.objects)
return body
})
.then(function (value) {
// do something with value
makeCall(value.objects)
idk(body.objects)
})
.catch(function (err) {
console.log(err)
});
第一个承诺解决后,您可以使用return将值传递给下一个.then方法。
答案 1 :(得分:0)
也许这更清楚了。由于我是makeCall函数的承诺,因此您可以访问.then方法。
makeCall(options).then(res => {
options = {
url = "yourendpoint.com" + res.objects[0].team1;
}
makeCall(options).then(res => {
console.log(res)
})
options = {
url = "yourendpoint.com" + res.objects[0].team2;
}
makeCall(options).then(res => {
console.log(res)
})
})
function makeCall(options) {
return rp(options)
.then(function (body) {
return Body
})
.catch(function (err) {
console.log(err)
});
}
或者您可以在异步函数中等待承诺解决,如下所示:
call();
call = async () => {
// some logic
let res = await makeCall(options);
// do something with response
// create new options
let req = await makeCall(options);
}
function makeCall(options) {
return rp(options)
.then(function (body) {
return body
})
.catch(function (err) {
return err
});
}