What is the best way to limit concurrency when using ES6's Promise.all()?

前端 未结 17 762
执念已碎
执念已碎 2020-11-29 21:28

I have some code that is iterating over a list that was queried out of a database and making an HTTP request for each element in that list. That list can sometimes be a rea

17条回答
  •  眼角桃花
    2020-11-29 22:04

    Here goes basic example for streaming and 'p-limit'. It streams http read stream to mongo db.

    const stream = require('stream');
    const util = require('util');
    const pLimit = require('p-limit');
    const es = require('event-stream');
    const streamToMongoDB = require('stream-to-mongo-db').streamToMongoDB;
    
    
    const pipeline = util.promisify(stream.pipeline)
    
    const outputDBConfig = {
        dbURL: 'yr-db-url',
        collection: 'some-collection'
    };
    const limit = pLimit(3);
    
    async yrAsyncStreamingFunction(readStream) => {
            const mongoWriteStream = streamToMongoDB(outputDBConfig);
            const mapperStream = es.map((data, done) => {
                    let someDataPromise = limit(() => yr_async_call_to_somewhere())
    
                        someDataPromise.then(
                            function handleResolve(someData) {
    
                                data.someData = someData;    
                                done(null, data);
                            },
                            function handleError(error) {
                                done(error)
                            }
                        );
                    })
    
                await pipeline(
                    readStream,
                    JSONStream.parse('*'),
                    mapperStream,
                    mongoWriteStream
                );
            }
    

提交回复
热议问题