用法:
使用async 声明函数,在async函数内使用await
async function xxx(){
await [表达式1]
await [表达式2]
//.....
}
await可以跟普通的表达式和值,但是这么做毫无意义
async function gogogo(){
let a = 1
a = await 2
console.log(a)
}
gogogo();

在await后面跟Promise对象,才是其真正的用法:
function thePromise(){
return new Promise(resolve=>{
setTimeout(()=>{
resolve('异步完成')
},1000)
})
}
async function gogogo(){
let a = 1
a = await thePromise() // 异步完成
console.log(a)
}
gogogo(); //像普通函数一样调用

说明:await 会输出Promise对象resolve/reject后的值,只有Promise被resolve/reject之后,async函数才会往下走
如果调用了then,await输出then返回的值
function thePromise(){
return new Promise(resolve=>{
setTimeout(()=>{
resolve('异步完成')
},1000)
}).then(resolve=>{
return '真的完成了!'
})
}

进阶:thenable对象
试想看这样一段代码,val的值是什么?
const thenable = {
then (resolve) {
resolve(666)
}
}
async function go () {
const val = await thenable
console.log(val)
}
go()
答案是 666
如果一个对象包含有then方法,则称其为thenable
对象,await碰到了thenable
则会调用其then
方法并传入resolve,reject回调,then函数中调用者2个对调改变这个thenable的状态(fullfiled
/rejected
),效果等同于Promise实例。
所以,可以在then函数中第二个参数,把thenable对象变成rejected
态
const thenable = {
then (resolve, reject) {
reject(666)
}
}
async function go () {
try {
await thenable
} catch (e) {
console.error('拒绝',e) // '拒绝', 666
}
}
go()
网友评论