【问题标题】:getting data from paginated API calls without knowing the count在不知道计数的情况下从分页 API 调用中获取数据
【发布时间】:2019-11-24 09:59:27
【问题描述】:

我必须从支持偏移量和限制的 API 获取所有数据,但我不知道计数或最大偏移量。

我使用 while true 并在调用没有返回数据时中断循环

let flag = true;
let query_obj = {limit : 10, offset: 0};
while (flag) {
    const data = await axios.get('https://domain.ex/path?limit=' + query_obj.limit + 'offset=' + query_obj.offset);
    query_obj.offset += query_obj.limit;
    if(data.items.length === 0){
        flag = false;
    }
}

我正在寻找最佳实践,所以我认为 while 循环和循环内的 await 并不是最好的。

我正在考虑使用promise.all或RXJS的解决方案,您有什么建议

谢谢

【问题讨论】:

标签: javascript node.js


【解决方案1】:

我认为你的方法是正确的。您可以通过并行运行多个请求对其进行一些优化。但这可能会导致对后端的无用调用。

let flag = true;
let query_obj = {limit : 10, offset: 0, parallel: 5};
while (flag) {
   const waitAll = range(query_obj.parallel).map((idx) => axios.get('https://domain.ex/path?limit=' + 
   query_obj.limit + 'offset=' + (query_obj.offset + idx*query_obj.limit)))

   const results = Promise.all(waitAll);
   flag = results.filter(data => data.items.length===0).length===0;
   query_obj.offset += query_obj.limit * query_obj.parallel;
}

通过这 5 个请求并行检索数据,应用在处理结果之前等待所有这些请求。所以对于这 5 个请求,你只需要等待最长的请求。这可能会稍微提高性能。但如前所述,如果总结果只有 10 个项目,那么您将执行 4 个无用的请求,这些请求都返回零个项目。

range 是 lodash 提供的辅助函数,只创建一个包含 5 个项目的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多