How can I do pagination with Bluebird Promises?
bluebird, javascript, node.js, promise
Solution
You should be able to use `promisify()`/`promisifyAll()` to convert `trader.getTrades()` to an async version that returns a promise. Then, something like this should work well:
function getAllTrades(limit, offset, query) {
var allTrades = [];
function getTrades(limit, offset, query){
return trader.getTradesAsync(limit, offset, query)
.each(function(trade) {
allTrades.push(trade)
// or, doStuff(trade), etc.
})
.then(function(trades) {
if (trades.length === limit) {
offset += limit;
return getTrades(limit, offset, query);
} else {
return allTrades;
}
})
.catch(function(e) {
console.log(e.stack);
})
}
return getTrades(limit, offset, query)
}
If you knew the total # of trades in advance you could use a different strategy with `.map` and `{concurrency: N}` to get N pages of trades at once.
Problem
I have something like ``` new Promise (resolve, reject) -> trader.getTrades limit, skip, (err, trades) -> return reject err if err resolve trades .each (trade) -> doStuff trade ``` `limit` is set to some arbitrary number, say `10` and `skip` starts at `0`. I want to keep increasing `skip` until there are no more `trades`. The `doStuff` is a function I'm using to process each trade. This works the first time, but I want to get more trades in a paginated fashion. Specifically, I want to run `trader.getTrades` with a higher `skip` until `trades.length` is 0