- Notifications
You must be signed in to change notification settings - Fork61
Map over promises concurrently
License
sindresorhus/p-map
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Map over promises concurrently
Useful when you need to run promise-returning & async functions multiple times with different inputs concurrently.
This is different fromPromise.all()
in that you can control the concurrency and also decide whether or not to stop iterating when there's an error.
npm install p-map
importpMapfrom'p-map';importgotfrom'got';constsites=[getWebsiteFromUsername('sindresorhus'),//=> Promise'https://avajs.dev','https://github.com'];constmapper=asyncsite=>{const{requestUrl}=awaitgot.head(site);returnrequestUrl;};constresult=awaitpMap(sites,mapper,{concurrency:2});console.log(result);//=> ['https://sindresorhus.com/', 'https://avajs.dev/', 'https://github.com/']
Returns aPromise
that is fulfilled when all promises ininput
and ones returned frommapper
are fulfilled, or rejects if any of the promises reject. The fulfilled value is anArray
of the fulfilled values returned frommapper
ininput
order.
Returns an async iterable that streams each return value frommapper
in order.
import{pMapIterable}from'p-map';// Multiple posts are fetched concurrently, with limited concurrency and backpressureforawait(constpostofpMapIterable(postIds,getPostMetadata,{concurrency:8})){console.log(post);};
Type:AsyncIterable<Promise<unknown> | unknown> | Iterable<Promise<unknown> | unknown>
Synchronous or asynchronous iterable that is iterated over concurrently, calling themapper
function for each element. Each iterated item isawait
'd before themapper
is invoked so the iterable may return aPromise
that resolves to an item.
Asynchronous iterables (different from synchronous iterables that returnPromise
that resolves to an item) can be used when the next item may not be ready without waiting for an asynchronous process to complete and/or the end of the iterable may be reached after the asynchronous process completes. For example, reading from a remote queue when the queue has reached empty, or reading lines from a stream.
Type:Function
Expected to return aPromise
or value.
Type:object
Type:number
(Integer)
Default:Infinity
Minimum:1
Number of concurrently pending promises returned bymapper
.
Only forpMapIterable
Type:number
(Integer)
Default:options.concurrency
Minimum:options.concurrency
Maximum number of promises returned bymapper
that have resolved but not yet collected by the consumer of the async iterable. Calls tomapper
will be limited so that there is never too much backpressure.
Useful whenever you are consuming the iterable slower than what the mapper function can produce concurrently. For example, to avoid making an overwhelming number of HTTP requests if you are saving each of the results to a database.
Only forpMap
Type:boolean
Default:true
Whentrue
, the first mapper rejection will be rejected back to the consumer.
Whenfalse
, instead of stopping when a promise rejects, it will wait for all the promises to settle and then reject with anAggregateError
containing all the errors from the rejected promises.
Caveat: Whentrue
, any already-started async mappers will continue to run until they resolve or reject. In the case of infinite concurrency with sync iterables,all mappers are invoked on startup and will continue after the first rejection.Issue #51 can be implemented for abort control.
Only forpMap
Type:AbortSignal
You can abort the promises usingAbortController
.
importpMapfrom'p-map';importdelayfrom'delay';constabortController=newAbortController();setTimeout(()=>{abortController.abort();},500);constmapper=asyncvalue=>value;awaitpMap([delay(1000),delay(1000)],mapper,{signal:abortController.signal});// Throws AbortError (DOMException) after 500 ms.
Return this value from amapper
function to skip including the value in the returned array.
importpMap,{pMapSkip}from'p-map';importgotfrom'got';constsites=[getWebsiteFromUsername('sindresorhus'),//=> Promise'https://avajs.dev','https://example.invalid','https://github.com'];constmapper=asyncsite=>{try{const{requestUrl}=awaitgot.head(site);returnrequestUrl;}catch{returnpMapSkip;}};constresult=awaitpMap(sites,mapper,{concurrency:2});console.log(result);//=> ['https://sindresorhus.com/', 'https://avajs.dev/', 'https://github.com/']
- p-all - Run promise-returning & async functions concurrently with optional limited concurrency
- p-filter - Filter promises concurrently
- p-times - Run promise-returning & async functions a specific number of times concurrently
- p-props - Like
Promise.all()
but forMap
andObject
- p-map-series - Map over promises serially
- More…
About
Map over promises concurrently