性价比高的网站建设快点号自媒体平台注册
前端面试题-异步任务队列控制
感觉面试的心里素质还是不够好,当时用的是promise.race思路,面完回来手撕了一下发现是自己想复杂了。
大致题意 1000个请求,每次发送6个,当请求发送成功时,马上发起下一个任务使得当前运行任务一直保持在6个
回来手撕了一下基本可以满足题意
const task_1 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第一个任务执行完成')resolve()}, 1000);})}const task_2 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第二个任务执行完成')resolve()}, 2000);})}const task_3 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第三个任务执行完成')resolve()}, 3000);})}const task_4 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第四个任务执行完成')resolve()}, 4000);})}const task_5 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第五个任务执行完成')resolve()}, 5000);})}const task_6 = () => {return new Promise((resolve, reject) => {setTimeout(() => {console.log('第六个任务执行完成')resolve()}, 6000);})}const totalTask = [task_1, task_2, task_3, task_4, task_5, task_6]const limit = 2const addTask = () => {if(!totalTask.length) returntotalTask.shift()().then(doneTask => addTask())}totalTask.slice(0, limit).forEach((task,taskIndex) => {task().then(doneTask => addTask())})// 前limit个已经执行完成,从任务列表中去除totalTask.splice(0,limit)