面试题答案
一键面试1. 设计思路
- 顺序执行:使用
async/await
可以很方便地实现顺序执行,因为await
会暂停当前函数的执行,直到被等待的Promise解决。 - 并发执行:使用
Promise.all
来并发执行多个异步操作,Promise.all
接受一个Promise数组,当所有Promise都解决时,返回一个新的已解决的Promise。 - 条件判断:在
async
函数内部使用普通的if - else
语句来根据条件决定后续的异步流程。
2. 优化策略
- 减少不必要的等待时间:对于可以并发执行的异步操作,使用
Promise.all
并发执行,而不是顺序执行。这样可以充分利用CPU和网络资源,减少总的执行时间。 - 提高资源利用率:避免在不必要的地方使用
await
,特别是当某些操作不依赖于其他操作的结果时。同时,合理设置并发操作的数量,防止过多的并发导致资源耗尽。
3. 代码实现
假设我们有三个异步操作asyncOperation1
,asyncOperation2
和asyncOperation3
,asyncOperation1
和asyncOperation2
需要并发执行,之后根据asyncOperation1
的结果决定是否执行asyncOperation3
。
function asyncOperation1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Result of asyncOperation1');
}, 1000);
});
}
function asyncOperation2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Result of asyncOperation2');
}, 1500);
});
}
function asyncOperation3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Result of asyncOperation3');
}, 1000);
});
}
async function main() {
const [result1, result2] = await Promise.all([asyncOperation1(), asyncOperation2()]);
console.log('Result of asyncOperation1:', result1);
console.log('Result of asyncOperation2:', result2);
if (result1.includes('1')) {
const result3 = await asyncOperation3();
console.log('Result of asyncOperation3:', result3);
}
}
main();
在上述代码中:
asyncOperation1
和asyncOperation2
通过Promise.all
并发执行。- 等待
Promise.all
完成后,根据asyncOperation1
的结果决定是否执行asyncOperation3
。 - 通过这种方式,实现了复杂业务场景下异步操作的顺序、并发执行以及条件判断。