1. async函数
返回一个promise对象。若返回值出现代码逻辑错误,那promise的状态就为rejected/失败,用.catch捕获;若返回值没有错误,那promise的状态就为resolve/成功,并且将return的结果作为参数,传给它的.then方法。
async function fn(){
return '函数执行结果';
// return y;
};
const res = fn();
console.log(res); //打印一个状态为fulfilled,结果为'函数执行结果'的promise对象
//return的代码逻辑错误时,打印一个状态为rejected,结果为'y is not defined'的对象
res.then(r=>{
console.log(r); //'函数执行结果'
}).catch(e=>{
console.log(e); //return y 时,结果为'y is not defined'
})
2. await
需要写在async函数内部,为了等待异步操作。如果异步操作前写了await,就需要等到这个异步执行完成并产生结果,await后面的代码才能执行。如果异步操作的结果为成功,直接返回结果;如果异步操作的结果为失败,浏览器自动抛出异常,需要捕获失败的结果。 await后面跟对象,那返回的就是resolve/reject的结果。
如果await后跟的不是promise对象,那直接返回原来的值。
async function gn(){
const data = await new Promise((res,rej)=>{
res('异步成功的结果');
// rej('异步失败的结果')
})
console.log('await后面的代码'); //res调用时 打印'await后面的代码'
//rej调用时,不打印
}
gn().then(r=>{
console.log(r); //res调用时 打印'异步成功的结果'
}).catch(e=>{
console.log(e); //rej调用时,打印'异步失败的结果'
})
await是为了等待异步结果,它本身是属于同步代码,它之后的代码在异步操作成功后才生效,属于异步代码,需要同步代码执行完后才能执行。
await的使用形式:可以用在箭头函数、函数定义式、对象、class中。
//箭头函数
const fn = async()=>{ }
//函数表达式
var b = async function(){ }
//对象的方法
var obj = {
async getName(){
console.log('111');
},
sayHello:async function(){
console.log('222');
}
}
//类
class Cat {
constructor(){
this.sayAge = async function(){ };
async run(){ };
static async pull(){ };
}
3. 事件循环
总代码分为同步任务(主线程)和异步任务,异步任务分为微任务和宏任务
执行顺序:先同步,再微,后宏
宏任务:script(整体代码)、setTimeout
微任务:Promise.then、await之后的代码
案例:
async function async1() {
console.log('async1 start'); //同步
await async2(); //同步
console.log('async1 end'); //异步1 await之后的为微任务
}
async function async2() {
console.log('async2'); //同步
}
console.log('script start'); //同步
setTimeout(function () {
console.log('setTimeout');
}, 0); //异步 宏任务
async1(); //同步
new Promise(function (resolve) {
console.log('promise1'); //同步
resolve();
}).then(function () { //异步2
console.log('promise2');
});
console.log('script end'); //同步
//打印顺序:
script start/async1 start/async2/promise1/script enda/sync1 end/promise2/setTimeout