好家伙,本篇为《JS高级程序设计》第十章“期约与异步函数”学习笔记

 

ES8 的 async/await 旨在解决利用异步结构组织代码的问题。

为为此增加了两个新关键字:async 和 await。

 

1.async关键字

1.1.使用说明

async 关键字用于声明异步函数。

函数声明、函数表达式、箭头函数和方法都可以使用

使用 async 关键字可以让函数具有异步特征,但总体上其代码仍然是同步求值的。

而在参数或闭包方面,异步函数仍然具有普通 JavaScript 函数的正常行为。

async function foo() {}
let bar = async function() {};
let baz = async () => {};
class Qux {
async qux() {}
}

 

 

1.2.返回值

异步函数如果使用 return 关键字返回了值(如果没有 return 则会返回 undefined),这个值会被 Promise.resolve()包装成一个期约对象。

异步函数始终返回期约对象。

async function foo() {
return 3;
}
console.log(foo());

 

 

 也可以直接返回一个契约

async function bar() {
console.log("I am bar");
return Promise.resolve(3);
}
console.log("--------------");
console.log(bar());
console.log(1);

 

 

1.3.在异步函数中抛出错误会返回拒绝的期约

async function foo() {
console.log(1);
throw 3;
}
// 给返回的期约添加一个拒绝处理程序
foo().catch(console.log);
console.log(2);

1.4.但是,拒绝期约的错误不会被异步函数捕获

async function foo() {
console.log(1);
Promise.reject(3);
}
// Attach a rejected handler to the returned promise
foo().catch(console.log);
console.log(2);

 

2.await关键字

这里我们拆分一下 a-wait

也就是asynchronous-wait 异步-暂停

异步函数主要针对不会马上完成的任务,所以自然需要一种暂停和恢复执行的能力。

使用 await 关键字可以暂停异步函数代码的执行,等待期约解决。

(是暂停异步)

基本使用

async function foo() {
let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3));
console.log(await p);
}
foo();
// 3 (一秒钟后出现)

 

(然而这好像看不出什么)

要完全理解 await 关键字,必须知道它并非只是等待一个值可用那么简单。

JavaScript 运行时在碰 到 await 关键字时,会记录在哪里暂停执行。

等到 await 右边的值可用了,JavaScript 运行时会向消息 队列中推送一个任务,这个任务会恢复异步函数的执行。

async function foo(){
console.log(1);
console.log( await 4);
}
foo();
console.log(2);
console.log(3);

这里我们按上面的话尝试翻译一下发生了什么事

(1)调用异步函数foo()

(2)输出1

(3)准备打印,一看诶有个await,先暂停,为立即可用的值4向消息队列中添加一个任务,

( 怎么说呢,我反复看了很多遍.这里的意思大概是把一个要求值或者说要返回结果的式子推进消息队列,

但这里就只有一个4,求个毛线,直接就是4,就是把这个4推进消息队列. ),后让出线程

(4)执行同步函数输出 2

(5)输出3

(6)"4"求出来了,就是4

(7)await右边出值了,向消息队列中添加一个"恢复foo()执行"的任务

(8)从消息队列中取出"恢复foo()执行"的任务,恢复foo()异步函数的执行

(9)输出4

大概就是这么个过程

3.课后习题

 1.请给出下列代码的输出结果,并配合"消息队列"写出相关解释

async function foo() {
console.log(2);
console.log(await Promise.resolve(8));
console.log(9);
}
async function bar() { console.log(4);
console.log(await 6);
console.log(7);
}
console.log(1);
foo();
console.log(3);
bar();
console.log(5);

尝试做一下吧,结果一定出乎你的意料

(明天再出一章写解释)

第126篇: 异步函数(async和await)的更多相关文章

  1. 令人清爽的异步函数async、await

    1.什么是async.await? async用于声明一个函数是异步的.而await从字面意思上是"等待"的意思,就是用于等待异步完成.并且await只能在async函数中使用; ...

  2. vue中异步函数async和await的用法

    整理的不错,收藏一下 http://blog.sina.com.cn/s/blog_13d06fc1f0102wzfr.html

  3. .net 异步函数 Async await

    .net  异步函数  Async await 一旦为函数添加async关键字 该函数就是一个异步函数. 异步方法必须返回 void 或 Task<> 类型. public static ...

  4. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  5. 异步函数async await在wpf都做了什么?

    首先我们来看一段控制台应用代码: class Program { static async Task Main(string[] args) { System.Console.WriteLine($& ...

  6. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  7. 常见的异步方式async 和 await

    之前研究过c#的async和await关键字,幕后干了什么,但是不知道为什么找不到相关资料了.现在重新研究一遍,顺便记录下来,方便以后查阅. 基础知识 async 关键字标注一个方法,该方法返回值是一 ...

  8. 彻底搞懂C#异步编程 async和await的原理

    1.前提 熟练掌握Task并行编程. 2.用Task并行解释async和await异步 因为控制台有多线程操作的优化,因此这里选择winform来做示例. 测试代码如下所示: 有三个textbox,一 ...

  9. C#异步编程(async and await)及异步方法同步调用

    1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库=异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方 ...

  10. 异步编程- async和await

    使用目的 避免阻塞主线程 提高程序响应能力 C#中使用 C# 中的 Async 和 Await 关键字是异步编程的核心. 疑惑 The async and await keywords don't c ...

随机推荐

  1. MYsql备份恢复简单过程

    1. 备份数据库 建完数据库更新完补丁之后进行数据库的备份操作. mysqldump -uroot --databases yourdatabase -p > /home/yourdatabas ...

  2. 升级到win11 22h2的体验

    win11 22h2更稳定了 在win11 22h2发布后没多久,我就升级到了这个版本,截止目前已经使用半个月了,谈谈我的使用感受. 总体要比之前的版本更稳定,表现为笔记本风扇不会突然响,突然卡顿,不 ...

  3. lua开发和调试环境

    Lua开发环境搭建 Lua官网提供源码下载需要自己编译,Lua官网:https://www.lua.org/ftp/ lua for windows.exe(占二十多MB那个) 目前在网络上没有找到 ...

  4. python快速入门【三】-----For 循环、While 循环

    python入门合集: python快速入门[一]-----基础语法 python快速入门[二]----常见的数据结构 python快速入门[三]-----For 循环.While 循环 python ...

  5. 【一】AI Studio 项目详解【(一)VisualDL工具、环境使用说明、脚本任务、图形化任务、在线部署及预测】PARL

    相关文章 [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简介 [五]-Sarsa&Qlear ...

  6. 14.4 Socket 双向数据通信

    所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互,此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包,这样一旦套接字被建立则两者都可以异步发送消 ...

  7. 3.4 DLL注入:全局消息钩子注入

    SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保 ...

  8. Flask 框架实现自定义分页

    手撸的表格分页: Flask框架下的分页,我研究了很久,自带的分页方法不稳定,还不如自己手撸的好使. <!--name:ndex.html--> <!DOCTYPE html> ...

  9. C/C++ 动态解密释放ShellCode

    今天在复习<加密与解密>时,在软件保护这一章中有一个代码与数据结合的案例,其原理是将代码段中的代码进行xor异或加密处理以后回写到原始位置,当程序运行后将此处的内容动态的进行解密,解密后回 ...

  10. 苹果打破12年惯例:iPad一整年未更新

    1月2日消息,据媒体报道,自2010年首次亮相以来,苹果一直保持着每年至少发布一款新型号的传统. 但是在过去的2023年,苹果没有发布iPad,2023年苹果发布的唯一与iPad相关的产品是USB-C ...