跳到主要内容

复杂_异步队列问题

Question

修改下面的 start 函数, 使 execute 对应的 id 按顺序打印.

function start(id) {
execute(id).catch(console.error);
}

/**
* 以下为测试代码,请勿修改:
*/
console.log('输出结果:');

for (let i = 0; i < 5; i++) {
start(i);
}

function sleep(duration) {
return new Promise(resolve => setTimeout(resolve, duration));
}

function execute(id) {
let duration = Math.floor(Math.random() * 500);

return sleep(duration).then(() => {
console.log('id', id);
});
}

// 输出结果参考
// id 0
// id 1
// id 2
// id 3
// id 4

Answer

const waittingQueue = [];
let curTask = null;
function start(id) {
if (curTask !== null) {
waittingQueue.push(id);
return;
}
curTask = id;
execute(id)
.catch(console.error)
.then(() => {
curTask = null;
if (waittingQueue.length) {
start(waittingQueue.shift());
}
});
}