function createTask(i) {
return () => new Promise(res => {
console.log(`task${i} start`);
setTimeout(() => {
res(i);
console.log(i);
}, i * 1000);
console.log(`task${i} end`);
});
}
async function runTasks() {
const tasks = Array(5).fill(null).map((item, idx) => {
return createTask(idx);
})
const res = await run(tasks, 2);
console.log(res);
}
runTasks();
async function run(tasks, maxTask) {
return new Promise((resolve) => {
if (!tasks.length) {
res([]);
return;
}
let nowIndex = 0;
let count = 0;
const result = [];
const min = Math.min(tasks.length, maxTask);
function request(index) {
nowIndex ++;
tasks[index]().then(res => {
result[index] = res;
count ++;
if (count === tasks.length) {
resolve(result);
} else {
request(nowIndex);
}
})
}
for(let i = 0; i < min; i ++) {
request(i);
}
})
}