Использование ответов от получения запросов для создания нового запроса - PullRequest
0 голосов
/ 20 марта 2019

Итак, я сейчас использую 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, но все безрезультатно.Любая помощь (и объяснение того, почему это работает) поможет.

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Может быть, это более понятно.Поскольку я возвращаю обещание из функции 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
        });
}
0 голосов
/ 20 марта 2019

Вы можете обещать цепочку так:

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.

...