对承诺的非递归分页

时间:2016-11-11 13:21:30

标签: javascript recursion pagination

使用典型的分页API返回

{
    "data": ...,
    "nextPageHref": <url>
}

如何在不使用递归的情况下获取JavaScript 中的所有页面?

(递归解决方案就像)

fetchPaginated(url) {
  return fetch(url).then(result => result.nextPageHref
    ? fetchPaginated(result.nextPageHref).then(results => _.concat(result, results))
    : result
}

2 个答案:

答案 0 :(得分:2)

AFAIK在没有递归的情况下执行此操作的唯一方法是对async-await的本机支持并使用for循环。请注意,编译的async-await也会编译为一些伪装的递归代码。

但是这种递归不是递归,因为对fetchPaginated的调用是从回调调用的,所以同步调用堆栈将始终在回调之前被清空(因此它与尾递归几乎没有关系)。如果您担心浏览器异步调用堆栈(仅用于调试目的,我们不需要异步调用堆栈来运行程序),我认为浏览器开发工具中应该有一个复选框来转它关闭。

enter image description here

答案 1 :(得分:0)

我猜您可以在询问页面时发送总页数 - /get_page?page_num=4

{
    "data": ...,
    "number_of_pages": 73
}

如果您可以要求第5页,这将告诉您。

此外,它还有一个优点,即您可以让用户跳过5页或访问最后一页,您可以使用您建议的方法。