await的作用(举例)

问:
当方法a中又三个方法a1、a2、a3、a4都是异步函数,现在在a2、a4追加await,方法执行顺序是什么?主进程顺序是什么?

答:

通过一个具体的例子来说明当方法 a 中有四个异步方法 a1、a2、a3 和 a4,并且在 a2 和 a4 前面加上 await 时,方法的执行顺序和主进程的顺序。

示例代码
假设我们有以下代码:

深色版本
async function a1() {
  console.log('a1 start');
  await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒
  console.log('a1 end');
}

async function a2() {
  console.log('a2 start');
  await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒
  console.log('a2 end');
}

async function a3() {
  console.log('a3 start');
  await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒
  console.log('a3 end');
}

async function a4() {
  console.log('a4 start');
  await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作,延时1秒
  console.log('a4 end');
}

async function a() {
  console.log('a start');
  a1(); // 不等待 a1 完成
  await a2(); // 等待 a2 完成
  a3(); // 不等待 a3 完成
  await a4(); // 等待 a4 完成
  console.log('a end');
}

a();

执行顺序和主进程顺序

主进程顺序:
  • console.log('a start');:立即执行,输出 a start。

  • a1();:调用 a1,但不等待 a1 完成,立即继续执行后续代码。

  • await a2();:调用 a2 并等待 a2 完成。在这期间,主进程会被阻塞,不会继续执行 a3。

  • a3();:调用 a3,但不等待 a3 完成,立即继续执行后续代码。

  • await a4();:调用 a4 并等待 a4 完成。在这期间,主进程会被阻塞,不会继续执行 console.log(‘a end’);。

  • console.log('a end');:在 a4 完成后执行,输出 a end。

异步方法的执行顺序:
  • a1 开始执行:
    • console.log(‘a1 start’);:立即执行,输出 a1 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a2 开始执行:
    • console.log(‘a2 start’);:立即执行,输出 a2 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a3 开始执行:
    • console.log(‘a3 start’);:立即执行,输出 a3 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。
  • a4 开始执行:
    • console.log(‘a4 start’);:立即执行,输出 a4 start。
    • await new Promise(resolve => setTimeout(resolve, 1000));:模拟异步操作,延时1秒。

最终输出顺序:

a start
a1 start
a2 start
a3 start
a2 end
a4 start
a1 end
a3 end
a4 end
a end

解释

主进程顺序:
  • a start:首先输出 a start。
  • a1 被调用,但不等待其完成,继续执行后续代码。
  • a2 被调用,并等待其完成。在这期间,主进程会被阻塞,不会继续执行 a3。
  • a3 被调用,但不等待其完成,继续执行后续代码。
  • a4 被调用,并等待其完成。在这期间,主进程会被阻塞,不会继续执行 console.log(‘a end’);。
  • a end:在 a4 完成后输出 a end。
异步方法的执行顺序:
  • a1、a2、a3 和 a4 都是异步方法,它们会并行执行。
  • a2 和 a4 的异步操作会阻塞主进程,直到它们完成。
  • a1 和 a3 的异步操作不会影响 a2 和 a4 的等待,因为 await 只会阻塞当前的异步函数 a,不会阻塞其他异步方法的执行。

结论

  • 主进程顺序:a start -> a1 start -> a2 start -> a3 start -> a2 end -> a4 start -> a1 end -> a3 end -> a4 end -> a end。
  • 异步方法的执行顺序:a1 start -> a2 start -> a3 start -> a2 end -> a4 start -> a1 end -> a3 end -> a4 end。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值