Understanding promise.race() usage

后端 未结 6 1494
隐瞒了意图╮
隐瞒了意图╮ 2020-12-09 17:14

As far as I know, there are two options about promise:

  • promise.all()

  • promise.race()

Ok, I know what promise.all()<

6条回答
  •  既然无缘
    2020-12-09 17:59

    I've used it for request batching. We had to batch tens of thousands of records into batches for a long running execution. We could do it in parallel, but didn't want the number of pending requests to get out of hand.

    Race lets us keep a fixed number of parallel promises running and add one to replace whenever one completes

    const _ = require('lodash')
    
    async function batchRequests(options) {
        let query = { offset: 0, limit: options.limit };
    
        do {
            batch = await model.findAll(query);
            query.offset += options.limit;
    
            if (batch.length) {
                const promise = doLongRequestForBatch(batch).then(() => {
                    // Once complete, pop this promise from our array
                    // so that we know we can add another batch in its place
                    _.remove(promises, p => p === promise);
                });
                promises.push(promise);
    
                // Once we hit our concurrency limit, wait for at least one promise to
                // resolve before continuing to batch off requests
                if (promises.length >= options.concurrentBatches) {
                    await Promise.race(promises);
                }
            }
        } while (batch.length);
    
        // Wait for remaining batches to finish
        return Promise.all(promises);
    }
    
    batchRequests({ limit: 100, concurrentBatches: 5 });
    

提交回复
热议问题