const taskPool = [] // 请求池 let numRequest = 0 // 正在执行数量 const maxRequest = 4 // 可配置 let taskTimer // 轮询的定时器 const cachedTask = {} // 存放的任务数据 // 预加载池的添加 function addTaskIntoPool(task) { return new Promise((resolve, reject) => { const cache = cachedTask[task.key] const subscribe = (executeRes) => { if (executeRes.success) { resolve(executeRes.res) } else { reject(executeRes.err) } } const priority = (task.priority || task.priority === 0) || 999 if (cache) { cache.priority = priority const callbacks = cache.callbacks || [] callbacks.push(subscribe) } else { task.callbacks = [subscribe] cachedTask[task.key] = task taskPool.push(task) } }) } // 执行下载 function executeTask() { if (taskPool.length > 0) { sortTaskPool() const executeRequest = maxRequest - numRequest if (executeRequest > 0) { for (let i = 0; i < executeRequest; i++) { const task = taskPool.shift() if (!task) { return } numRequest++ task.execute().then((res) => { numRequest-- task.callbacks && task.callbacks.map(callback => { callback({ success: true, res }) }) executeTask() }, (err) => { numRequest-- task.callbacks && task.callbacks.map(callback => { callback({ success: false, err }) }) delete cachedTask[task.key] executeTask() }) } } } else { startTaskTimer() } } function sortTaskPool() { if (taskPool.length > 0) { taskPool.sort((a, b) => a - b) } } // 轮询检查请求池中是否有请求需要执行 function startTaskTimer() { taskTimer = setInterval(() => { if (taskPool.length > 0) { stopTaskTimer() executeTask() } }, 500) } // 停止轮询 function stopTaskTimer() { clearInterval(taskTimer) taskTimer = null } export default { addTaskIntoPool, executeTask, startTaskTimer }