2016-11-11 114 views
1

在一个典型的分页API返回与承诺

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

我如何可以获取在JavaScript 所有页面,而无需使用递归非递归分页?

(递归的解决方案是一样的东西)

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

为什么你想这样做没有递归? –

+0

更好的堆栈跟踪,如果你使用thenable JS是不是尾递归(至少不是无处不在,没一会儿) – JonathanR

+0

,我相信一个恰当的无极规范库,应该做类似的太nextTick东西,所以你应该堆栈清除。如果这就是你'更好的堆栈痕迹'的意思。 – Keith

回答

2

AFAIK做到这一点,而不递归的唯一方法是异步等候的原生支持,并使用一个for循环。请注意,编译的async-await也会编译成一些伪装的递归代码。

但是这个递归不是递归的,因为调用fetchPaginated是从回调中调用的,所以同步调用栈在回调之前总是被清空(因此它跟尾递归没有关系)。如果您关心浏览器异步调用堆栈(这只是为了调试目的,我们不需要异步调用堆栈来运行程序),我认为浏览器开发人员工具中应该有一个复选框来关闭它。

enter image description here

+0

这是一个非常好的点,调用函数将在递归调用发生之前完成。谢谢! – JonathanR

+0

真的很好的一步一步的解释[这里](http://stackoverflow.com/a/37406665/3099140) – JonathanR

0

我想你可以根据请求的页面发送的总页数 - /get_page?page_num=4

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

这会让你知道,如果你可以要求第5页。

此外,它的优点在于可以让用户跳过5页或访问的最后一页,你不能用approa做你建议。

+0

我的API仅支持基于令牌的分页。我必须抓取页面'n'才能获取页面'n + 1'(请注意,许多现实生活中的API,例如谷歌和Facebook)遵循这种模式来强制人们实际使用分页,而不是通过同时请求每页来绕过它) – JonathanR

+0

@JonathanR那么你为什么要绕过分页? –

+0

您可以将当前页面分配给令牌,然后使用'/ get_next_page'获取下一页,'/ get_first_page'重置计数器。 –