1.1作用
避免有更多的请求操作,出现多重嵌套,也就是俗称的“回调地狱”
因此可以使用ES6的Promise,将回调函数的嵌套,改为了链式调用:
var promise = new Promise((resolve, reject) => {
fs.readFile('./hehe.txt', 'utf8', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
}).then(() => {
// 异步API执行正确,拿到正确的数据
this.getInfo()
}).catch(() => {
// 异步API执行异常,拿到错误的数据
console.log('Error')
})
1.2声明方式
异步函数存在以下四种使用形式:
函数声明:async function foo() {}
函数表达式:const foo = async function() {}
对象的方式:let obj = { async foo() {} }
箭头函数:const foo = async () => {}
1.3支持返回Promise和同步的值
异步函数的返回值会被包装成一个Promise实例
用return传递正确的结果
用throw传递错误的结果,一旦抛出错误,后面的代码就不会执行了
await关键字:await后面一般跟Promise实例(其实也可以跟其他的数据,如果是其他的数据,则直接返回),await可以阻塞后续的代码,等待Promise实例返回结果后,再继续向下执行
await可以直接拿到Promise实例的正确结果,错误结果需要用try ... catch 或 catch(err => err)(推荐用这个)来获取
await只能出现在异步函数(亲爸爸)中
async function timer(time) {
return new Promise((ok, on) => {
setTimeout(() => {
ok()
}, time)
})
}
timer(100).then(() => {
console.log(1);
return timer(200)
}).then(() => {
console.log(2);
return timer(300)
}).then(() => {
console.log(3);
})