面试题答案
一键面试顺序处理异步数据
在JavaScript中,可以使用生成器函数和迭代器来实现异步数据的顺序处理。生成器函数是一种返回迭代器的函数,它可以暂停和恢复执行,这使得我们可以很好地控制异步操作的流程。
下面是一个使用生成器函数和迭代器顺序处理异步数据的示例:
function asyncTask1() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 1 completed');
resolve('Result of Task 1');
}, 1000);
});
}
function asyncTask2() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 2 completed');
resolve('Result of Task 2');
}, 1000);
});
}
function asyncTask3() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 3 completed');
resolve('Result of Task 3');
}, 1000);
});
}
function* asyncTasksGenerator() {
const result1 = yield asyncTask1();
const result2 = yield asyncTask2();
const result3 = yield asyncTask3();
return [result1, result2, result3];
}
function runAsyncTasks() {
const generator = asyncTasksGenerator();
let result;
function handleNext() {
const { value, done } = generator.next(result);
if (done) {
console.log('All tasks completed:', value);
return;
}
Promise.resolve(value)
.then((res) => {
result = res;
handleNext();
});
}
handleNext();
}
runAsyncTasks();
并发处理异步数据
对于并发处理异步数据,我们可以使用Promise.all
结合生成器函数来实现。Promise.all
接受一个Promise数组,并返回一个新的Promise,只有当所有的Promise都解决时,这个新的Promise才会解决。
以下是一个并发处理异步数据的示例:
function asyncTask1() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 1 completed');
resolve('Result of Task 1');
}, 1000);
});
}
function asyncTask2() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 2 completed');
resolve('Result of Task 2');
}, 1000);
});
}
function asyncTask3() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Task 3 completed');
resolve('Result of Task 3');
}, 1000);
});
}
function* asyncTasksGenerator() {
const tasks = [asyncTask1(), asyncTask2(), asyncTask3()];
const results = yield Promise.all(tasks);
return results;
}
function runAsyncTasks() {
const generator = asyncTasksGenerator();
const { value, done } = generator.next();
if (done) {
console.log('All tasks completed:', value);
} else {
Promise.resolve(value)
.then((res) => {
const finalResult = generator.next(res).value;
console.log('All tasks completed:', finalResult);
});
}
}
runAsyncTasks();
在上述代码中,asyncTasksGenerator
生成器函数中,使用Promise.all
来并发执行多个异步任务。runAsyncTasks
函数负责启动生成器并处理Promise的结果。