// /*
// 执行所有异步任务,但控制最大同时执行的任务数为 3 个
// 假设有一系列返回 Promise 的异步任务 jobs,每个任务所需要的时间都不相同,
// 所有任务都一定不会失败。
// 请实现一个输入为 jobs 的函数 runParallel,功能是执行 jobs 中的所有异步任务,
// 但控制最大同时执行的任务数为 3 个。
// runParallel 最终按照 jobs 数组顺序,把每个任务的返回值储存在一个数组里,
// 并返回这个数组(类似 Promise.all)。
function limitPromise(list, max) {
let count = 0
let taskList = []
let resultList = Array.from(list).fill(0)
for (let i = 0; i < list.length; i++) {
let task = everyPromise(list[i], i)
if (count < max) {
task()
} else { taskList.push(task) }
}
function everyPromise(item, i) {
return () => {
let promise = item()
promise.then((data) => {
count--
resultList[i] = data
if (taskList.length) {
let task = taskList.shift()
task()
} else if(count==0){
console.log(JSON.stringify(resultList))
}
})
count++
}
}
}
let promise0 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(0)
resolve(0)
}, 5000)
})
}
let promise1 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(1)
resolve(1)
}, 3000)
})
}
let promise2 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(2)
resolve(2)
}, 1000)
})
}
let promise3 = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(3)
resolve(3)
}, 1000)
})
}
let list= [promise0, promise1,promise2, promise3]
limitPromise(list, 3)
// 2,3,1,0
// [1,2,3,4]
// 用async实现的话会更简单 外部是同步 内部是异步
async function logInOrder(urls) {
// 并发读取远程URL
const textPromises = urls.map(async url => {
return await url
});
// 按次序输出
for (const textPromise of textPromises) {
await textPromise.then(data => console.log(data));
}
}
网友评论