作用
在async/await
之前,我们有三种方式写异步代码:
嵌套回调
以Promise为主的链式回调
使用Generators
但是,这三种写起来都不够优雅,ES7做了优化改进,async/await应运而生。
async/await相比较Promise 对象,then 函数的嵌套,与 Generator 执行的繁琐(需要借助co才能自动执行,否则得手动调用next() )。
async/await
可以让你轻松写出同步风格的代码同时又拥有异步机制,更加简洁,逻辑更加清晰。
特点
async/await
更加语义化,async
是“异步”的简写,async function
用于申明一个 function 是异步的;await
,可以认为是async wait
的简写, 用于等待一个异步方法执行完成;async/await
是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)可以通过多层
async function
的同步写法代替传统的callback
嵌套。
async function语法
自动将常规函数转换成Promise,返回值也是一个Promise对象;
只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数;
异步函数内部可以使用await。
await语法
await 放置在Promise调用之前,await 强制后面点代码等待,直到Promise对象resolve,得到resolve的值作为await表达式的运算结果;
await只能在async函数内部使用,用在普通函数里就会报错。
具体使用
async和await要搭配Promise使用, 它进一步极大的改进了Promise的写法。
首先看一个简单场景:
1 | //假设有4个异步方法要按顺序调用 |
语法上不够简洁, 我们可以稍微改造一下
1 | //将请求改造成一个通用函数 |
然后我们再来重新改造开头的代码
1 | request("ajaxA") |
比起之前有了不小的进步, 但是看上去依然不够简洁
如果我能像使用同步代码那样, 使用Promise就好了
于是, async\await
出现了
1 | async function load(){ |
到这你已经学会了async
和await
基本使用方式。
下面来简单解释一下它的工作流程:
1 | //wait这个单词是等待的意思 |
如果后一个请求需要前一个请求的结果怎么办呢?
传统的写法是这样的:
1 | request("ajaxA") |
而使用async/await
是这样的:
1 | async function load(){ |
注意当一个函数被async修饰以后, 它的返回值会被自动处理成Promise对象
关于异常处理
1 | async function load(){ |