How can I do pagination with Bluebird Promises?

前端 未结 3 1114
北荒
北荒 2021-01-02 17:24

I have something like

new Promise (resolve, reject) ->
  trader.getTrades limit, skip, (err, trades) ->
    return reject err if err

    resolve trade         


        
3条回答
  •  萌比男神i
    2021-01-02 18:23

    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.

提交回复
热议问题