node.js - 如何重复从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);
});
解决方案
当您必须在某些条件下重复时,您通常会进行递归。在这里,除非满足条件,否则您没有将代码无限期地重复。你刚刚调用了它三遍。请尝试以下代码:
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;
}
}
可能有一些语法错误,请尝试让我知道。
推荐阅读
- .net - 用户身份验证前的初始 API 令牌 - .NET 核心 Web API
- vba - MS Access - 使用 VBA 自动为“访问无法附加所有数据”错误消息选择是
- java - 以下代码的递归关系是什么:
- c++ - 查找 std::list 是否包含来自另一个 std::list 的元素
- tensorflow - 如何在 Bazel 中获取文件的绝对路径
- selenium - 如何使用 selenium webdriver java 单击 chrome 扩展?
- css - 在标题中垂直居中内联块元素
- html - 在谷歌表中使用 D3.js 搜索可折叠树
- c# - CREATE/ALTER/PRINT 之后的 System.Data.SqlClient.SqlException
- python - 来自 pandas DataFrame 的字典 {cell1:cell2}