Как повторить выборку данных из успокоительного API, пока тело данных не будет иметь другой статус? - PullRequest
0 голосов
/ 30 октября 2019

Я создаю приложение для извлечения данных из SkyScanner (с RapidApi). В основном я должен "открыть сессию" с API, а затем получить ключ сессии, чтобы получить результаты. - Это не проблема.

Когда я получаю результаты, мне нужно проверить, имеет ли тело результата (не заголовки) статус с «UpdatesPending». Если это так - мне нужно отправить эти результаты на сторону клиентов, но продолжайте извлекать результаты с другим запросом к API, пока я не получу результат с "UpdatesComplete".

Хотел бы немного помочь здесь.

Я пытался сделать оператор if, но, похоже, это не решает проблему .. Я использую Node.js и lib-обещание запроса.

  rp(options)
.then(response => {
  let index = response.headers.location.lastIndexOf("/");
  console.log(index);
  let sessionKey = response.headers.location.slice(index + 1);
  console.log(sessionKey);

  return sessionKey;
})
.then(sessionKey => {
  let options = {
    method: "GET",
    url: `https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/uk2/v1.0/${sessionKey}`,
    qs: { pageIndex: "0", pageSize: "10", sortType: "price", stops: stops },
    headers: {
      "x-rapidapi-host":
        "skyscanner-skyscanner-flight-search-v1.p.rapidapi.com",
      "x-rapidapi-key": `${RapidapiKey}`
    },
    resolveWithFullResponse: true
  };

  let status;
  console.log("first status", status);

  rp(options)
    .then(response => {
      status = JSON.parse(response.body).Status;
      res.status(200).write(response.body);
      if (status !== "UpdatesComplete") {
        rp(options)
          .then(response => {
            console.log(JSON.parse(response.body).Status);
            status = JSON.parse(response.body).Status;
            res.status(200).write(response.body);
            return response;
          })
          .catch(err => {
            console.log(err);
          });

        console.log("inside if status", status);
      }
      return response;
    })
    .catch(err => {
      console.log(err);
    });
})
.catch(err => {
  console.log(err);
});

1 Ответ

1 голос
/ 30 октября 2019

Когда вам нужно повторить с каким-то условием, вы обычно идете на рекурсию. Здесь вы не ставите код для повторения до тех пор, пока не будет выполнено условие. Вы только что назвали это три раза. Пожалуйста, попробуйте следующий код:

rp(options)
.then(handleResponse)
.catch(err => {
    console.log(err);
});

function handleResponse(response) {

  let index = response.headers.location.lastIndexOf("/");
  let sessionKey = response.headers.location.slice(index + 1);

  let options = {
      method: "GET",
      url: `https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/uk2/v1.0/${sessionKey}`,
      qs: { pageIndex: "0", pageSize: "10", sortType: "price", stops: stops },
      headers: {
        "x-rapidapi-host":
            "skyscanner-skyscanner-flight-search-v1.p.rapidapi.com",
        "x-rapidapi-key": `${RapidapiKey}`
      },
      resolveWithFullResponse: true
  };

  status = JSON.parse(response.body).Status;
  res.status(200).write(response.body);

  if (status !== "UpdatesComplete") {
    return rp(options).then(handleResponse);
  } else {
    return response;
  }
}

Может быть какая-то синтаксическая ошибка, попробуйте и дайте мне знать.

...