当前位置:网站首页>asyncawait和promise的区别
asyncawait和promise的区别
2022-07-29 12:20:00 【免费的东西】
async
async函数定义
async函数是使用关键字声明的函数。async 是“异步”的简写,所以应该很好理解 async 用于申明一个 function 是异步的。
作用
用于解决:异步程序产生的bug
####async函数的语法
async function name([param[, param[, ... param]]]) {
statements
}
参数:name 函数名称
param 要传递给函数的参数的名称
statements 包含函数主体的表达式 ,可以使用await
返回值: 一个全新的promise,这个promise要么会通过一个由async函数返回的值被解决,要么会通过一个从async函数中抛出的(或其中没有被捕获到的)异常被拒绝
下面为async的具体使用实例:
async function foo(p) {
console.log("foo run",p);
return 1;
}
var res = foo(1);
console.log(res);//{<fulfilled>: 1}
async函数一定会返回一个promise对象。如果一个async函数的返回值看起来不是promise,那么它将会被隐式地包装在一个promise中。
例如,如下代码:
async function foo() {
//promise.[[promiseValue]]
return 1
}
//等价于
function foo() {
return Promise.resolve(1)
}//{<fulfilled>: 1}
下面是对async的一些补充:
async 本身是一个语法糖—>语法糖:带有一定功能的关键字
- 语法糖的作用:能够减少代码量、增加程序的可读性,从而减少程序代码出错的机会
async 函数中 return 值如何接受
方式一
通过 promise.then-cb 形参获取
async function foo(){
console.log(222222);
return 123;
}
let res = foo();
res.then(data=>{
console.log(data);//123
})
方式二
第二种接受函数返回值的方式是 await
(async function (){
console.log('async run');
//第二种接受函数返回值的方式是 await
let res = await foo();
console.log(res);
})()
async function foo(){
console.log('foo run');
return 123;
}
//res作用:接受 async foo函数返回值 是promise
let res = foo();
await
await定义
await 的意思是等待,所以应该很好理解,await 等待某个操作完成。
作用
await关键字的作用 就是获取 Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值(await 作用是获取promise.[[promiseValue]]的值)
关于await的注意点
await 必须写在 async 中
await 后是一个promise实例对象
[[promiseValue]]
[[PromiseValue]]是个内部变量,外部无法得到,只能在then中获取。
[promiseValue]哪些能赋值
- async函数的return
- new promise 中 resolve实参
- then 中 return (catch finally 中的return)
- promise.reslove()实参 promise.reject()实参
三者的区别
- promise和 async/await都是解决异步编程的一种方式,但是async/await使得异步代码看起来像同步代码。
- 函数前面多了一个async关键字。await关键字只能用于async定于的函数内。async函数会隐式地返回一个Promise,该promise的resolve值就是return的值。
为什么async/await更好?
使用async函数可以让代码简洁很多,不需要像Promise一样需要then,不需要写匿名函数处理Promise的resolve的值,也不需要定义多余的data变量,还避免了嵌套代码。
async/await 让 try/catch可以同时处理同步和异步的错误。在下面的示例中,try/catch不能处理JSON.parse的错误,因为它在Promise中,我们需要使用.catch,这样的错误会显得代码非常的冗余。
边栏推荐
- 栈“后进先出”和队列中“先进先出”的含义
- npm install 报错问题解决合集
- Basic knowledge of redis database learning - basic, commonly used
- 【云原生】微服务之Feign的介绍与使用
- JS advanced four (map, reduce, filter, sort, arrow function, class inheritance, yield)
- Based article 】 【 learn with Rust | Rust function and process control, rounding
- 第十章 发现和记录 REST API
- 【每日SQL打卡】DAY 22丨平均售价【难度中等】
- APP本机号码一键登录
- 容器化 | 在 Rancher 中部署 MySQL 集群
猜你喜欢

TiDB升级与案例分享(TiDB v4.0.1 → v5.4.1)

记账APP:小哈记账3——登录页面的制作
![[WeChat applet] WXSS and global, page configuration](/img/ff/fe4c827bc887b8afefa72dc9b230af.jpg)
[WeChat applet] WXSS and global, page configuration

网络层和传输层限制

爱可可AI前沿推介(7.29)

TiFlash 源码阅读(五) DeltaTree 存储引擎设计及实现分析 - Part 2

Chapter 6 c + + primer notes 】 【 function

2.1 Bubble sort (mercifully Sorting)

nacos cluster construction

Container is changed | deploy MySQL cluster in the Rancher
随机推荐
MLX90640 infrared thermal imaging temperature measuring sensor module development notes (9)
PHP 基础知识
MySql字符串拆分实现split功能(字段分割转列、转行)
DAY 24 daily SQL clock 】 【 丨 weather types in different countries [difficult simple]
WordPress 固定链接设置
influxdb2的使用
Draw boxes of WPF screenshots controls and ellipse (4) "imitation WeChat"
数组及其内存管理三问
跨域: 汇总
【day04】IDEA, method
【每日SQL打卡】DAY 22丨页面推荐【难度中等】
Codeforces Round #797 (Div. 3)个人题解
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
WordPress 主题和插件
金仓数据库KingbaseES安全指南--6.7. GSSAPI身份验证
【每日SQL打卡】DAY 21丨报告系统状态的连续日期【难度困难】
XSS Vulnerability Analysis
【每日SQL打卡】DAY 27丨每次访问的交易次数【难度困难-提前放出来】
MarkDown高阶语法手册
QCon大会广州站它来了!独家定制双肩背包等你领取!