function asyncTask(duration, value) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(value);
}, duration);
});
}
function* taskGenerator() {
yield asyncTask(1000, 'Task 1');
yield asyncTask(2000, 'Task 2');
yield asyncTask(1500, 'Task 3');
}
async function executeTasks() {
const tasks = taskGenerator();
let result = [];
let task;
try {
while (!(task = tasks.next()).done) {
const value = await task.value;
result.push(value);
}
} catch (error) {
console.error('Error occurred:', error);
return;
}
return result;
}
executeTasks().then(finalResult => {
console.log('All tasks completed. Result:', finalResult);
});
迭代器在异步环境下的处理
- 暂停:在
taskGenerator
函数中,yield
关键字使得迭代器暂停执行。当执行到yield asyncTask(...)
时,迭代器暂停,将asyncTask
返回的Promise作为next
方法返回对象的value
属性值。
- 恢复:在
executeTasks
函数的while
循环中,使用await
等待Promise解决。当Promise解决后,await
表达式恢复执行,将Promise的解决值赋给value
,然后继续执行循环体的后续部分,通过tasks.next()
恢复迭代器的执行,获取下一个任务。
- 错误处理:在
executeTasks
函数中,使用try...catch
块捕获在异步任务执行过程中可能抛出的错误。如果任何一个asyncTask
抛出错误,catch
块将捕获该错误,打印错误信息并提前结束任务执行,避免后续任务继续执行。