【发布时间】:2022-01-01 05:51:59
【问题描述】:
我正在开发一个 node.js 项目,我需要使用 axios 来访问 API。该 API 与数据一起返回,一个不同的 URL(URL 中的查询参数更改),我需要为每个后续调用点击,基本上对数据进行分页。该查询参数值是不可预测的(它没有编号为“1 2 3 4”)。
我无法一次获取所有 URL,我必须在每个请求中只获取下一个。
我需要来自所有 api 调用的所有数据。
我认为这需要怎么做:
- 创建一个数组
- 向 api 发出请求
- 将响应推送到数组
- 向 API 发出另一个请求,但使用之前调用的查询参数。
- 将响应推送到数组,重复第 4 步和第 5 步,直到 API 不再提供下一个 URL。
- 在所有承诺完成后对收到的数据采取行动。 (示例可以简单地通过控制台记录所有这些数据)
我想因为我需要链接所有这些请求,所以我并没有真正获得 Promise/async 的好处。那么也许 axios 和 Promise 是不适合这项工作的工具?
我尝试过的:
- 我已经尝试在第一个
axios().then()while 循环中执行 axios 请求,直到没有更多的“下一个”链接。这显然失败了,因为 while 循环不会等到请求返回。 - 我尝试声明一个函数,其中包含我的 axios 请求和
.then()。在.then()中,如果结果中存在下一个 URL,我有函数调用本身。 - 查看但未尝试 promise.all()/axios.all(),因为这似乎只有在您知道所有您预先访问的 URL 时才有效,因此它似乎不适用于这种情况.
- 尝试了in this answer 的建议,但似乎 .then 在所有承诺都返回后不会出现。
递归函数方法示例:
const apiHeaders={
'Content-Type': 'application/json',
'Authorization': `Bearer ${appToken}`,
'Accept': 'application/json'
};
let initialURL = 'https://example.com/my-api';
let combinedResults =[];
function requestResultPage(pageURL){
let options = {
url:pageURL,
method: 'GET',
headers: apiHeaders,
params:{
limit:1
}
};
axios(options)
.then(function (response) {
// handle success
console.log("data response from API",response.data);
combinedResults.push(response.data.results);
if(typeof response.data.paging.next !== 'undefined'){
console.log("multiple pages detected");
let paginatedURL = response.data.paging.next.link;
console.log("trying:",paginatedURL);
requestResultPage(paginatedURL);
}
}).catch(function(error){
console.log(error);
})
};
requestResultPage(initialURL);
console.log(combinedResults);
我知道最后的控制台日志不起作用,因为它发生在承诺完成之前......所以我必须弄清楚这一点。似乎我的承诺循环在第一个承诺之后失败了。
在承诺中思考有时仍然让我感到困惑,我很感激人们愿意分享的任何智慧。
我想因为我需要链接所有这些请求,所以我并没有真正获得 Promise/async 的好处。那么也许 axios 和 Promise 是适合这项工作的错误工具?如果是这种情况,请随时大声疾呼。
【问题讨论】:
-
你的意思是什么“似乎我的promise循环在第一个promise之后失败了。”,什么表明它失败了?你是说你只看到
"data response from API"登录一次? -
@NickParsons 是正确的,以及“检测到多个页面”,但之后什么都没有。
标签: javascript node.js promise axios