首先,让我们隐藏那个丑陋的回调API:
var getTrades = Promise.promisify(trader.getTrades, trader)
现在,为了遍历分页API,我们将使用简单的递归下降方法:
function getAllTrades(limit, arr) {
if (!arr) arr=[];
return getTrades(limit, arr.length).then(function(results) {
if (!results.length)
return arr;
else
return getAllTrades(limit, arr.concat(results));
});
}
诚然,concat
并不是超级快的,因为它在每个请求之后都会创建一个新数组,但这是最优雅的方法。
此函数将返回一个 Promise,当所有请求完成后,该 Promise 将解析为一个包含所有结果的巨大数组。当然,这可能不是您想要的-也许您想立即显示第一批结果,并仅在需要时懒加载后续结果?那么单个 Promise 并不是您想要的工具,因为这种行为更像流式。不过,它仍然可以使用 Promise 编写:
getTradeChunks = (limit, start = 0) ->
getTrades limit, start
.then (chunk) ->
throw new Error("end of stream") if not chunk.length
s = start+chunk.length
[chunk, -> getTradeChunks limit, s]
rec = ([chunk, cont]) ->
Promise.each chunk, doStuff
.then -> waitForClick $ "#more"
.then cont
.then rec, err
end = (err) ->
$ "#more"
.text "no more trades"
getTradeChunks 15
.then rec, err
.each doStuff
的副作用影响了你的所有代码? - Bergitrader.getTrades
不是一个真正的函数。可以将其理解为从数据存储中返回交易的一种方式。 - Shamoonskip
继续执行直到trades.length === 0
。 - Shamoon