await的作用(举例)

ops/2024/10/10 23:29:14/

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

答:

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

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

javascript">深色版本
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。

http://www.ppmy.cn/ops/123703.html

相关文章

【内存池】——Nginx 内存池结构设计

目录 实现思路——分而治之 Nginx 的内存池结构图 结构体设计 内存池设计: 数据区属性设计: 大块内存区设计: 伪代码解释: 数据结构实现 实现思路——分而治之 算法结构:链表顺序表 1、对于每个请求或者连接都会建…

设计模式(3)builder

需求: 对于复杂的对象,我们只需要 通过 设置一些参数,就可以得到相对应的 实例。 简单来说, 需求就是用一个类 通过方法返回一个 新建的对象,而且可以通过方法去设置这个对象 public interface CarBuilder {void se…

爬虫prc技术----小红书爬取解决xs

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

OpenAI .NET 库稳定版发布,支持 GPT-4o 并改进 API 功能

penAI 在6月推出其官方 .NET 库的 beta 版之后,如今终于发布了稳定版。该库已在 NuGet 上作为包发布,支持最新的模型,如 GPT-4o 和 GPT-4o mini,并且提供完整的 OpenAI REST API。这次发布包括同步和异步 API,以及流式…

我对软件工程的理解

1 引言 从事软件行业这么年,写了10年代码,又从事了多年的项目产品方面的工作,一些每天用到的软件工程的方法,虽然天天都在用但一些概念总感觉似是而非,正好借假期的时间,好好整理下,以供自己或…

秋招内推2025-招联金融

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

论文阅读——联邦忘却学习研究综述

文章基本信息 作者: 王鹏飞魏宗正周东生宋威肖蕴明孙庚于硕张强 机构: 大连理工大学计算机科学与技术学院大连理工大学社会计算与认知智能教育部重点实验室大连大学先进设计与智能计算教育部重点实验室美国西北大学计算机科学系吉林大学计算机科学与…

vim(1) -- 环境配置

1. 配置文件 编辑~/.vim/vimrc文件,内容如下。 " 开启语法高亮 syntax on " 显示行号 set number " 显示行下划线 set cursorline set scrolloff5 " 智能缩进 set smartindent " 行太长时换行显示 set wrap" 高亮搜索内容 set hlse…