首页 > 解决方案 > 如何重复从restful api获取数据,直到数据主体具有不同的状态?

问题描述

我正在构建一个应用程序来从 SkyScanner(使用 RapidApi)检索数据。基本上我必须使用 API “打开会话”,然后获取会话密钥来提取结果。- 这不是问题。

当我得到结果时,我需要检查结果正文(而不是标题)是否具有“UpdatesPending”的状态。如果是这样 - 我需要将这些结果发送到客户端,但通过另一个 API 请求继续提取结果,直到我得到“UpdatesComplete”的结果。

希望在这里得到一点帮助。

我试图做一个 if 语句,但它似乎没有解决它.. 我正在使用 Node.js 和 request-promise 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);
});

标签: node.jsloopsfetchskyscanner

解决方案


当您必须在某些条件下重复时,您通常会进行递归。在这里,除非满足条件,否则您没有将代码无限期地重复。你刚刚调用了它三遍。请尝试以下代码:

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

可能有一些语法错误,请尝试让我知道。


推荐阅读