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

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

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

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

  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);
});
0
Itzik Dabush 30 Окт 2019 в 08:38

1 ответ

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

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;
  }
}

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

1
binariedMe 30 Окт 2019 в 09:05
1
Благодарю вас! я попробую и дам вам знать.
 – 
Itzik Dabush
30 Окт 2019 в 09:51