Async/await详解

news/2024/11/25 19:50:34/

一、概念与背景

他是在ES8被提出的一种异步方式,它其实是promise的一种语法糖

二、 Async关键字

async 关键字用于快速声明异步函数 ,可以用在函数声明、函数表达式、箭头函数和方法上

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

2.1、特性

  • async声明的异步函数,如果没有返回值,则它就是普通函数,没有什么特别
async function foo() {console.log(1); 
} 
foo(); 
console.log(2); 
// 1 
// 2
  • async声明的异步函数,如果有返回值,则返回值会被Promise.resolve自动包装成promise返回
  • async声明的异步函数,可以用await来调用其他异步函数

三、await

该关键字可以暂停异步函数代码的执行,等待解决

let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3));p.then((x) => console.log(x)); // 3// 使用 async/await 可以写成这样:
async function foo() {
let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3));console.log(await p);
}
foo(); // 3

3.1、特性

  • await 关键字期待(但实际上并不要求)一个实现 thenable 接口的对象,但常规的值也可以。如果是实现 thenable 接口的对象,则这个对象可以由 await 来“解包”。如果不是,则这个值就被当作 已经解决的期约
// 等待一个原始值
async function foo() {console.log(await 'foo'); }
foo(); 
// foo// 等待一个没有实现 thenable 接口的对象async function bar() {console.log(await ['bar']); 
}
bar();// ['bar']// 等待一个实现了 thenable 接口的非期约对象 
async function baz() {const thenable = {then(callback) { callback('baz');}
};
console.log(await thenable); }
baz(); 
// baz// 等待一个期约 
async function qux() {console.log(await Promise.resolve('qux')); 
}
qux();
// qux
  • 如果await等待的结果是抛出了一个错误,或者是一个失败的promise,则不会执行异步函数中后面的代码了,该异步函数就会返回一个失败的promise
async function foo2() { console.log(1);const aaa = await (() => { throw 3; })();console.log(2)
}
foo2().then(console.log).catch(console.log)
// 1 3async function foo2() { console.log(1);const aaa = await 	Promise.reject(3)console.log(2)
}
foo2().then(console.log).catch(console.log)
// 1 3

3.2、await使用场景

await关键字只能在这两个场景下使用:
1、async定义的异步函数中;
2、模块的最外层作用域中(a、html中的script标签声明type='module’类型,b、es6中的模块js文件中)

四、分析执行顺序demo

async function foo() {console.log(await Promise.resolve('foo'));
}
async function bar() { console.log(await 'bar');
}
async function baz() { console.log('baz');
}
const p = new Promise(resolve=>{console.log(2222),resolve('promise')})
p.then(v=>console.log(v))
foo();
bar();
baz();
async function t1() { console.log(1111);console.log(await t2());console.log(2222);
}
async function t2() { console.log(3333);return await 4444
}
t1()
console.log(5555);
setTimeout(() => {console.log(6666);
}, 0)
new Promise((resolve, reject) => { console.log(7777);resolve()
}).then(() => { console.log(8888); 
})
console.log(9999);
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);
async function t1() { console.log('start test1');console.log(await t2());console.log('end test1');
}
async function t2() { console.log('test2');return await 'return test2 value'
}
t1()
console.log('start async');
setTimeout(() => {console.log('settimeout');
}, 0)
new Promise((resolve, reject) => { console.log('promise1');resolve()
}).then(() => { console.log('promise2'); })
console.log('end async');

http://www.ppmy.cn/news/83488.html

相关文章

linux CentOs 安装 docker

进入到我们的 linux 系统中,先查看是否已安装 docker 可以先尝试看一下 docker 版本: docker -v 然后提示了: -bash: docker: command not found 这就说明,没有 docker 这个命令。 还有一种,是查看 docker 服务状态…

Matlab:多目标约束优化问题测试集--LIR-COMP

多目标约束优化问题,是许多工程实际问题所需要解决的问题,针对这类问题,我们提出众多的智能算法来解决该类问题,比如差分进化算法、遗传算法、粒子群算法、分布式估计算法、蚁群算法等。 当涉及到多个目标和约束时,优化问题可能会变得更加复杂和具有挑战性。 然而,针对…

LiangGaRy-学习笔记-Day15

1、编写脚本 1.1、拓展:shell脚本语法 case语句: 主要用于做选择的;多条件、多分支结构; case语句注意事项 case行尾必须以单词“in”,每一模式必须以单个右括号")"结束双分号";;"表示命令序…

单片机GD32F303RCT6 (Macos环境)开发 (二十七)—— 蓝牙透传模块HC-08的调试

蓝牙透传模块HC-08的调试 1、模块为汇承HC-08,GD32我们之前已经把usart1 配置成了dmaidle的方式接收数据,我们的hc-08模块连接的就是这一路usart。 所以,与GD32的连接比较简单,如下图: GD32 HC-08 TX(PA2 ) RX RX(PA3…

5年测试老鸟整理,功能自动化测试入门到实践,超细总结...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

设计模式 - 原型模式

传统方式 public class Sheep {private String name;private int age;private String color;public Sheep(String name, int age, String color) {super();this.name name;this.age age;this.color color;}public String getName() {return name;}public void setName(Stri…

关于I/O

I/O 1. 概念1.1 页缓存的简单工作流程1.2 页缓存的写机制或者写触发的时机1.3 为什么需要套字节缓冲区1.4 套接字缓冲区的简单流程 2. 传统I/O方式2.1 传统I/O读写流程2.2 传统 I/O的性能问题 3. DMA技术3.1 将数据写入磁盘的流程3.2 从磁盘读取数据的流程 4. 网络数据传输流程…

C++第一章:开始

开始目录 引言一、开发环境和参考书籍二、一个简单的C程序三、初识输入和输出标准输入输出对象 四、注释五、控制流while循环for循环 六、数量不定数据的输入七、C 缩进和格式八、类简介使用一个类书店处理书籍信息程序 九、术语表 引言 C在人们的眼中通常是“复杂”一词的代表…