Blame view

node_modules/p-locate/index.js 934 Bytes
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  'use strict';
  const pLimit = require('p-limit');
  
  class EndError extends Error {
  	constructor(value) {
  		super();
  		this.value = value;
  	}
  }
  
  // the input can also be a promise, so we `Promise.all()` them both
  const finder = el => Promise.all(el).then(val => val[1] === true && Promise.reject(new EndError(val[0])));
  
  module.exports = (iterable, tester, opts) => {
  	opts = Object.assign({
  		concurrency: Infinity,
  		preserveOrder: true
  	}, opts);
  
  	const limit = pLimit(opts.concurrency);
  
  	// start all the promises concurrently with optional limit
  	const items = Array.from(iterable).map(el => [el, limit(() => Promise.resolve(el).then(tester))]);
  
  	// check the promises either serially or concurrently
  	const checkLimit = pLimit(opts.preserveOrder ? 1 : Infinity);
  
  	return Promise.all(items.map(el => checkLimit(() => finder(el))))
  		.then(() => {})
  		.catch(err => err instanceof EndError ? err.value : Promise.reject(err));
  };