You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
async function getABC() {
let A = await getValueA(); // getValueA 花费 2 秒
let B = await getValueB(); // getValueA 花费 4 秒
let C = await getValueC(); // getValueA 花费 3 秒
用 Async 函数简化异步代码
ES7 提出的
async
函数,终于让 JavaScript 对于异步操作有了终极解决方案。No more callback hell。async
函数是Generator
函数的语法糖。使用 关键字async
来表示,在函数内部使用await
来表示异步。Async - 定义异步函数(
async function someName(){...}
)await
Await - 暂停异步函数的执行 (
var result = await someAsyncCall();
)await
等待 Promise 完成,并返回 Promise 的结果await
只能和 Promise 一起使用,不能和 callback 一起使用await
只能用在async
函数中Async
函数的改进在于下面四点:Aysnc
函数自带执行器,调用方式跟普通函数的调用一样async
和await
相较于*
和yield
更加语义化co
模块约定,yield
命令后面只能是 Thunk 函数或 Promise对象。而async
函数的await
命令后面则可以是 Promise 或者 原始类型的值(Number,string,boolean,但这时等同于同步操作)async
函数返回值是 Promise 对象,比 Generator 函数返回的 Iterator 对象方便,可以直接使用then()
方法进行调用Async 与其他异步操作的对比
先定义一个 Fetch 方法用于获取 github user 的信息:
Promise 方式
Promise 的方式虽然解决了 callback hell,但是这种方式充满了 Promise的
then()
方法,如果处理流程复杂的话,整段代码将充满then
。语义化不明显,代码流程不能很好的表示执行流程。Generator 方式
Generator 的方式解决了 Promise 的一些问题,流程更加直观、语义化。但是 Generator 的问题在于,函数的执行需要依靠执行器,每次都需要通过
g.next()
的方式去执行。async 方式
async
函数完美的解决了上面两种方式的问题。流程清晰,直观、语义明显。操作异步流程就如同操作同步流程。同时async
函数自带执行器,执行的时候无需手动加载。多个并发:
Async/Await 底层依然使用了 Promise。
多个异步函数同时执行时,需要借助
Promise.all
async function getABC() {
let A = await getValueA(); // getValueA 花费 2 秒
let B = await getValueB(); // getValueA 花费 4 秒
let C = await getValueC(); // getValueA 花费 3 秒
}
每次遇到
await
关键字时,Promise 都会停下在,一直到运行结束,所以总共花费是 2+4+3 = 9 秒。await
把异步变成了同步。语法
async 函数返回一个 Promise 对象
async
函数内部 return 返回的值。会成为then
方法回调函数的参数。如果
async
函数内部抛出异常,则会导致返回的 Promise 对象状态变为reject
状态。抛出的错误而会被catch
方法回调函数接收到。async 函数返回的 Promise 对象,必须等到内部所有的 await 命令的 Promise 对象执行完,才会发生状态改变
也就是说,只有当
async
函数内部的异步操作都执行完,才会执行then
方法的回调。正常情况下,await 命令后面跟着的是 Promise ,如果不是的话,也会被转换成一个 立即 resolve 的 Promise
如下面这个例子:
如果返回的是 reject 的状态,则会被
catch
方法捕获。Async 函数的错误处理
async
函数的语法不难,难在错误处理上。先来看下面的例子:
如上面所示,当
async
函数中只要一个await
出现 reject 状态,则后面的await
都不会被执行。解决办法:可以添加
try/catch
。如果有多个
await
则可以将其都放在try/catch
中。如何在项目中使用
依然是通过
babel
来使用。只需要设置
presets
为stage-3
即可。安装依赖:
修改
.babelrc
:这样就可以在项目中使用
async
函数了。The text was updated successfully, but these errors were encountered: