async函数是什么
用于简化Promise异步调用的操作
是 Generator 函数的语法糖
async/await
类似于组合生成器和Promises
function resloveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(()=>{
resolve('resolved')
},3000)
})
}
async function asyncCall() {
console.log('calling');
var result = await resloveAfter2Seconds()
console.log(result);
}
asyncCall()
语法结构
异步函数
是指通过事件循环异步执行的函数,它会通过一个隐式的Pronise返回其结果。
异步函数声明式
用于定义一个返回Promise 对象的异步函数。
异步函数表达式
用于在表达式中定义异步函数。
区别:
在于异步函数表达式可以省略函数名称来创建一个匿名函数。
返回Promise对象
async 函数返回一个 Promise对象。async,函数内部return语句返回的值,会成为then方法回调函数的参数。
//async函数返回Promise对象
async function myAsync() {
return "hello world";
}
let promise = myAsync();
// console.log(promise);//Promise { 'hello world' }
promise.then((value) => {
console.log(value);//hello world
});
return语句中没有 await表达式,因为异步函数的返回值将被隐式地传递Promise.resolve
await表达式
await表达式是什么
用于等待一个Promnise 对象,它只能在异步函数异步函数中使用。
function createPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("执行成功");
}, 200);
});
}
async function myAsync() {
console.log("当前异步函数被调用了");
var result = await createPromise();
console.log(result);
}
myAsync();
错误处理
如果 await后面的异步操作出错,那么等同于async函数返回的Prornise 对象被
reject
function createPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("执行成功");
}, 200);
});
}
async function myAsync() {
console.log("当前异步函数被调用");
try {
var result = await createPromise();
} catch (e) {
console.log("出错了", e);
}
console.log(result);
}
myAsync();
注意事项
使用try…catch语句
await命令后面的Promise对象,运行结果可能是rejected,所以最好把 await表达式放置在try…catch 代码块中。
多个await同时触发
多个await表达式后面的异步操作,如果不存在继发关系,最好让它们同时触发。
await表达式的限制
await表达式只能用在 async函数之中,如果用在普通函数,就会报错。