面试题答案
一键面试// 模拟异步任务,返回Promise
function asyncTask1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Task 1 result');
}, 1000);
});
}
function asyncTask2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Task 2 result');
}, 1500);
});
}
function asyncTask3() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Task 3 result');
}, 2000);
});
}
// 创建一个可迭代对象,包含所有异步任务
const taskIterable = {
tasks: [asyncTask1, asyncTask2, asyncTask3],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.tasks.length) {
return {
value: this.tasks[index++](),
done: false
};
} else {
return {
done: true
};
}
}
};
}
};
// 使用async/await按顺序执行异步任务并处理结果
async function executeTasks() {
for await (const result of taskIterable) {
console.log(result);
}
}
executeTasks();
可迭代对象与异步操作协同工作原理
-
创建可迭代对象:
- 首先创建一个对象
taskIterable
,它包含一个tasks
数组,数组中存放所有的异步任务函数(这里是asyncTask1
、asyncTask2
、asyncTask3
)。 - 通过实现
Symbol.iterator
方法,使其成为可迭代对象。在Symbol.iterator
方法内部,使用index
变量来跟踪当前迭代的位置。每次调用next
方法时,返回下一个异步任务的Promise
对象(通过调用任务函数),直到所有任务都迭代完毕。
- 首先创建一个对象
-
使用
for await...of
循环:for await...of
循环是ES2018引入的语法,专门用于处理异步可迭代对象。- 当使用
for await...of
遍历taskIterable
时,每次迭代都会等待前一个异步任务(Promise
)完成,然后获取其结果(通过await
)。这样就确保了异步任务按顺序执行,并且可以方便地处理每个任务的结果。
通过这种方式,利用可迭代对象的特性与async/await
语法结合,使得异步任务的有序执行和结果处理代码更加清晰、易读,提高了代码的可读性和可维护性。