目的:将异步任务处理得像同步任务。
特点:语义化明确(async表示有异步任务、await表示等待右侧结果)、内置执行器(不用手动一步一步执行)、适用性广(await后可以跟原始类型或promise对象)、返回一个promise对象。
async function test () {
let n = await new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 300)
}).then(console.log)
console.log(2)
}
test()
// 1
// 2
:如果不使用async和await,输出应该是 2 1,这就是这个语法的作用。
async function test () {
let n = await new Promise((resolve, reject) => {
setTimeout(() => console.log(1), 300)
})
console.log(2)
}
test()
// 1
:如果await的promise对象没有被resolve,后面的代码将被一直阻塞。
async function test () {
let n = await new Promise((resolve, reject) => {
setTimeout(() => reject(1), 300)
})
console.log(2)
}
test()
// 报错 并且没有输出 2
如果await的promise的报错没有被处理,后面的代码也不会被执行。将报错进行catch处理,或将promise放在try {} catch {}中。
async function test () {
try{
let n = await new Promise((resolve, reject) => {
setTimeout(() => reject('err'), 300)
})
console.log(n)
} catch (err) {
console.log(err)
}
console.log(2)
}
test()
// err
// 2
async 返回的是一个promise对象,如果没有在async函数中写return,返回promise对象的resolved值为undefined,如果写了return,则resolved值为return的值。
async function test () {
try {
let n = await new Promise((resolve, reject) => {
setTimeout(() => reject('err'), 300)
})
console.log(n)
} catch (err) {
console.log(err)
}
console.log(2)
return 3
}
console.log(test())
/* Promise { <state>: "pending" }
<state>: "fulfilled"
<value>: 3
<prototype>: Promise.prototype { … }
debugger eval code:13:9 */
// err
// 2
参考
简书:async和await
阮一峰先生的ES6入门:async 函数