使用来自“获取请求”的响应来创建新请求

时间:2019-03-20 00:44:19

标签: node.js api asynchronous get request

因此,我目前正在从提供此类响应的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
    },

然后,我需要能够从此响应中获取五个字段-mSlugteam1team2datetime。我很容易得到mSlugdatetime。但是,问题是我需要使用从team1team2返回的链接来进行新的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请求,有的使用响应的信息,最后将数据连接在一起?我尝试使用fetchrequestrequest-promise,但无济于事。任何帮助(以及有关其工作原理的解释)都将有所帮助。

2 个答案:

答案 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
        });
}