在ES8中,新增了Async函数这一新特性。Async函数可以按照同步的方式编写异步的代码,使得异步的JavaScript编写更加容易和可读。本文将介绍Async函数的背景和特性,并提供一些使用Async函数的示例。
定义
Async函数是async关键字后跟一个函数声明或函数表达式。 Async函数可以包含await表达式,它将暂停函数执行,等待Promise解决,然后将解决值作为await表达式的值。
当函数调用时,它将返回一个Promise。 Async函数内部必须包含至少一个await表达式。
async function foo() { const data = await fetch('/api/data') return data.json() } foo().then(data => { console.log(data) })
如上的示例代码展示了一个简单的Async函数的实现,实现了通过异步方式获取API数据,并将数据转换为JSON并将其返回。
特性
Async函数的一个主要特性是执行环境的改变。
当一个函数被async修饰之后,它将变成一个异步函数,并且会返回一个Promise。同时这个函数会在主线程之外,在一个微任务队列中运行,Async函数内部不能有同步API。
async function getFoo() { return 'foo' } getFoo().then(foo => console.log(foo)) //'foo'
如果在Async函数中抛出任何异常,则返回的Promise将被拒绝。
async function foo() { throw new Error('Oops') } foo().catch(err => { console.log(err.message) //'Oops' })
同时,以下的三种情况会自动把异步操作包装成Promise返回。
-- -------------------- ---- ------- ----- -------- ----- - -- - -- --- ------- -- ------ -- - ----- -------- ----- - -- - --- ------- ------- -- ------ ----- - ----- -------- ----- - -- ----------- ------- -- ----- --- ------------- -
await
Await表达式暂停Async函数的执行,直到Promise完成并返回结果。
-- -------------------- ---- ------- ----- -------- ----- - ----- ---- - ----- ------------------- ----- ---- - ----- -------------------------- ----- ---- - ----- ----------------------------- ------ ---- - ----------------- -- - ------------------- --
在Async函数中,可以像同步代码那样使用try/catch来捕获异常。
-- -------------------- ---- ------- ----- -------- ----- - --- - ----- ---- - ----- ------------------ ------ ----------- - ----- ----- - ---------------------- ---- ------ -- ---- - - --------------- -- - ----------------- --
嵌套的Async函数
Async函数可以嵌套任意递归深度,这意味着可以在当前Async函数中调用另一个Async函数,而不需要担心回调地狱。
async function foo() { const resA = await someAsyncFunction() const resB = await anotherAsyncFunction(resA) const resC = await foo() return resC }
总结
在ES8中,Async函数是一个非常方便的方法来编写异步JavaScript代码。它简化了异步代码的编写方式,同时使代码更加可读和易于维护。以上关于Async函数的介绍,相信对有前端开发经验的人来说都已经看懂了。如果你是一个前端新手,那么希望我能为你提供一些帮助,让你能够尽快掌握这个功能。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647459b4968c7c53b01b9c97