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

Original source