Skip to content
On this page

控制并发执行函数

typescript
type TTask = (...args: any[]) => Promise<any>;

type TTaskResult = {
	status: 'resolved' | 'rejected';
	value?: any;
	reason?: any;
}

type TParallelCallResult = {
	resolved: ITaskResult[];
	rejected: ITaskResult[];
}

export const parallelCallTasks = (tasks: TTask[], concurrentNum: number) => {
	return new Promise((resolve, reject) => {
	  const queue: (() => TTask)[] = [];
	  const resolved: ITaskResult[] = [];
	  const rejected: ITaskResult[] = [];
	  let idx = 0;
	  let finishedIdx = 0;
	  const next = (task: TTask) => {
		  idx++;
		  task()
          .then(res => {
              resolved.push({ status: 'resolved', value: res })
          })
          .catch(reason => {
              rejected.push({ status: 'rejected', reason })
          })
          .finally(() => {
	          if(finishedIdx++ === tasks.length - 1) {
		          resolve({ resolved, rejected });
		          return;
	          }
              idx--;
              const fn = queue.shift();
              if(!!fn) {
                  fn();
              }
          })
    }
	tasks.forEach(task => {
		if (idx >= concurrentNum) {
			queue.push(() => next(task))
            return
        }
		next(task)
    })
  })
}