当前位置:网站首页>ES8 | async和await
ES8 | async和await
2022-08-08 07:53:00 【不爱吃菜的蔡菜】
async和await
async和await两种语法结合可以让异步代码像同步代码一样
async函数
async函数的返回值是promise对象
promise对象的结果由async函数执行的返回值决定
1.返回的结果不是一个promise类型的对象,则这个函数的返回结果是一个成功的Promise对象
<script>
async function fn() {
// 返回一个字符串
return 'HAHA';
}
const result = fn();
console.log(result);
</script>

2. 抛出错误,返回的结果是一个失败的Promise
<script>
async function fn() {
// 抛出错误,返回的结果是一个失败的Promise
throw new Error('出错了')
}
const result = fn();
console.log(result);
</script>

3. 返回的结果是一个Promise对象,如果Promise是成功的,那么函数就返回成功的内容
如果是失败的,就返回失败的内容
<script>
async function fn() {
// 返回的结果是一个Promise对象
return new Promise((resolve,reject)=>{
// resolve('成功的数据');
reject('失败了');
})
}
const result = fn();
console.log(result);
</script>


await 表达式
- await 必须写在 async 函数中
- await 右侧的表达式一般为promise对象
- await 返回的是promise 成功的值
- await 的promise 失败了,就会抛出异常,需要通过try…catch捕获处理
<script>
// 创建 Promise 对象
const p = new Promise((resolve, reject) => {
// resolve('成功的值');
reject('我失败了')
})
// await 必须写在 async 函数中
async function main() {
try {
let result = await p;
console.log(result); // await 返回的是promise 成功的值,不返回失败的值
} catch (e) {
// await 的promise 失败了,就会抛出异常,需要通过try...catch捕获处理
console.log(e);
}
}
// 调用函数main
main();
</script>
async 和await 结合读取文件
// 1. 引入fs模块
const {
log } = require('console');
const fs = require('fs');
// 2. 读取【为学】
// 返回的都是promise对象
function readWeiXue() {
return new Promise((resolve, reject) => {
fs.readFile('./resources/为学.md', (err, data) => {
// 如果失败
if (err) reject(err);
// 如果成功
resolve(data);
})
})
}
// 3. 读取【插秧诗】
// 返回的都是promise对象
function readChaYangShi() {
return new Promise((resolve, reject) => {
fs.readFile('./resources/插秧诗.md', (err, data) => {
// 如果失败
if (err) reject(err);
// 如果成功
resolve(data);
})
})
}
// 4. 读取【观书有感】
// 返回的都是promise对象
function readGuanShu() {
return new Promise((resolve, reject) => {
fs.readFile('./resources/观书有感.md', (err, data) => {
// 如果失败
if (err) reject(err);
// 如果成功
resolve(data);
})
})
}
// 声明一个async函数
async function main() {
// 读取为学内容
let weixue = await readWeiXue(); // 返回的是成功的值
// 读取插秧诗内容
let chayang = await readChaYangShi(); // 返回的是成功的值
// 读取观书有感内容
let guanshu = await readGuanShu(); // 返回的是成功的值
console.log(weixue.toString());
console.log(chayang.toString());
console.log(guanshu.toString());
}
main();
async 和await 结合发送ajax 请求
<script>
// 发起Ajax请求,返回的结果是一个promise 对象
function sendAJAX(url) {
return new Promise((resolve, reject) => {
// 1. 创建对象
const x = new XMLHttpRequest();
// 2. 初始化
x.open('GET', url);
// 3. 发送
x.send();
// 4. 事件绑定
x.onreadystatechange = function () {
if (x.readyState === 4) {
if (x.status >= 200 && x.status < 300) {
// 成功了
resolve(x.response);
} else {
// 失败了
reject(x.status)
}
}
}
})
}
// promise.then 方法测试
const result = sendAJAX("https://api/apiopen.top/getJoke").then(value => {
console.log(value);
}, reason => {
})
// async 与 await 测试
async function main() {
// 发送Ajax请求
let result = await sendAJAX("https://api/apiopen.top/getJoke");
console.log(result);
}
main();
</script>
边栏推荐
猜你喜欢
随机推荐
lua --- 基本语法学习
【vulhub】PostGresql高权限命令执行漏洞复现(CVE-2019-9193)
Zigbee常见错误问题汇总
请问ots表有点大,现在是通过外表查询的除了用sql还有其他方法优化嘛?
制作SD启动卡,从SD卡启动系统
小程序 数据监听(observers),避免赋值死循环
Task01 文件处理与邮件自动化
论文解读:《多层肽 - 蛋白质相互作用预测的深度学习框架》
单片机裸机编程中实用驱动分享
论文解读:《Amy pred-FRL是一种通过使用特征表示学习来精确预测淀粉样蛋白的新方法》
大文件上传时如何做到 秒传?
关于 QtCreator使用msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法
六十分之七——焦虑路上的涅槃
BLE安全之配对流程剖析(2)
选择适合投稿的英文期刊或会议的方法
lvm建立逻辑卷
[Optimized scheduling] Based on particle swarm to realize economic scheduling optimization of microgrid under grid-connected model with matlab code
“重载”与“重写”的区别
Database_JDBC
想用sql实现两日数据对比后,对新增数据单加一列标签









