Promise
# Limit
- 调用器
- 就是把真正的执行函数和参数传入,创建返回一个新的 Promise,而这个新 Promise 的什么时候返回,取决于这个异步任务何时被调度。Promise 内部主要就是创建一个任务,判断任务是执行还是入队。
- 任务创建
- 实际上就是返回了一个函数,将真正的执行函数放在里面执行。这里利用了 Promise 的 finally 方法,在 finally 中判断是否执行下一个任务,实现任务队列连续消费的地方就是这里。
class PromiseLimit { constructor(max) { /* 上限 */ this._max = max; /* 当前在执行的数量 */ this._count = 0; /* 等待执行的队列 */ this._taskQueue = []; } /** * 调用器 函数,排布任务 * @param caller 异步任务函数 async | promiseReturn * @param args 参数列表 * @returns {Promise} 新的 Promise */ call(caller, ...args) { return new Promise((resolve, reject) => { const task = this.createTask(caller, args, resolve, reject); if (this._count >= this._max) { this._taskQueue.push(task); } else { task(); } }); } /** * 任务创建 函数 * @param caller 实际执行函数 * @param args 执行函数的参数 * @param resolve * @param reject * @returns {Function} 任务函数 */ createTask(caller, args, resolve, reject) { return () => { caller(...args) .then(resolve) .catch(reject) .finally(() => { this._count--; if (this._taskQueue.length) { this._taskQueue.shift()(); } }); this._count++; }; } }jscopy success