async和await的不解之缘

94 阅读2分钟

async在干啥?

  • async是异步的简写,用来说明这个方法是异步的
  • async函数返回一个promise对象
  • 如果在async函数中,return一个值,async会把这个值通过promise.resolve()封装成为一个promise对象
  • 如果没有返回值,则返回promise.resolve(undefined)

await等啥子?

  • await在等一个用async的函数,语法说await在等一个表达式,或是表达式或是promise对象
  • 如果await等到的是一个promise对象,await会暂停async后面的代码,先执行async外面的代码,然后把resolve的参数作为await的结果
  • 不是一个promise对象,也会堵塞执行,把非promise的表达式,作为await表达式结果

async和await的使用

  • promise的链式调用,参数传递比较麻烦
function newData() {
return new Promise(resolve => {
    resolve(1);
})
    .then(result => console.log(result)) //1
    .then(result => {
        console.log(result);              //undefined
        return 2;
    })
    .then(result => {
        console.log(result);             //2
        throw new Error("err");
    })
    .then((result) =>{
        console.log(result);            
    }, (err)=>{
        console.log(err);                //Error: err
        return 3;
    })
    .then((result) => {
        console.log(result);            //3
    })
}
newData();
  • 为了简化promise的操作用async和await
function newData(ms) {
	return new Promise(resolve => {
    setTimeout(resolve, ms);
    })
    async data2(value,ms) {
    	await newData(ms);
    }
    data2('xiaoming',50); //每50ms输出一次xiaoming

}

总结

使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性。

async await 的优点:

  • 解决了回调地狱的问题
  • 支持并发执行
  • 可以添加返回值 return xxx;
  • 可以在代码中添加try/catch捕获错误

async是干啥的?

定义异步函数(内部通常有异步操作),返回Promise对象,如果返回Promise,返回return的Promise,否则返回Promise.resolve中的return值

await在等啥?

只能放在async函数中,等待右侧表达式结果,如果是函数则结果就是return值,字符串的话就是字符串

await等到了又要干啥?

阻塞后面的代码,先执行async外部的同步代码,同步代码执行完再回到async内部,拿到运算结果,返回promise的话就等待promise对象,将resolve参数作为表达式的结果,不是promise,直接将表达式作为结果