理解 Javascript async 和 await(解读 ECMAScript 2018)
Javascript 是一种单线程执行的编程语言,因此处理一些异步操作时需要使用回调函数或者 Promise 对象。但是在 ECMAScript2017中,新增加了 async 和 await 这两个关键词,使得程序员在编写异步操作时更加方便和简洁。
async 与 await 基本使用
async 用于定义一个异步函数,在函数内部使用 await 关键字来阻塞等待异步任务完成。
下面是一个简单的示例:
-- -------------------- ---- ------- ----- -------- ---------- --- -------- - ----- --------------------------------------------- --- ---- - ----- ---------------- ------ ---------- - ------------------- -- - ------------------ ---
在上面的例子中,getName 函数用 async 定义,内部使用 await 等待 fetch 异步请求完成并返回响应,然后等待将响应解析为 JSON。最后返回响应数据的名字。在函数返回值后,使用 promise.then() 来捕获 name 并打印到控制台。
async 函数返回一个 promise 对象,当函数有显式 return 语句时,promise 对象的值就是 return 语句返回的值;当没有 return 语句时,promise 对象的值就是 undefined。
await 关键字只能在异步函数内部使用,并且必须在 async 函数中使用。
async 函数还可以与箭头函数结合使用:
-- -------------------- ---- ------- ----- ------- - ----- -- -- - --- -------- - ----- --------------------------------------------- --- ---- - ----- ---------------- ------ ---------- - ------------------- -- - ------------------ ---
async 函数的错误处理
上述示例函数无法捕捉失败请求(例如服务器无法到达时)的错误。 为了捕获异常情况,可以使用 try-catch 块:
-- -------------------- ---- ------- ----- -------- ---------- --- - --- -------- - ----- --------------------------------------------- --- ---- - ----- ---------------- ------ ---------- - ----- ----- - ------------------- ----- - -
在上面的代码中,当 fetch 异步请求失败时,会触发 catch 块内的错误处理程序。此时 console.log 将会输出"请求失败",以及错误对象。
async 函数的并行操作
async 函数可以同时进行多个异步操作,等待最慢的异步操作执行完成后,函数才会返回。
-- -------------------- ---- ------- ----- -------- ------------- - ----- --------- ------ - ----- ------------- ---------------------------------------------------- ------------------------------------------------- --- --- ----------- - ----- --------------- --- --------- - ----- ------------- ------ - -------- ------------ ------ ---------- -- - --------------------------- -- - ---------------------- ---
在上面的示例中,getUserInfo 函数等待两个异步操作 fetch 执行完成。它们都成功返回响应,函数返回包含用户简介和帖子的对象。
总结
async 和 await 是 ECMAScript 2018 中的新功能。它使异步操作的编写变得更加方便和简洁,并且可以用于并行操作,并且通过使用 try-catch 块来处理错误。
在我们的示例代码中,我们尝试发起异步请求,并将返回的响应数据显示在控制台上。我们还演示了如何将 async 函数与箭头函数或者返回解析为 promise 的函数组合使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647a9456968c7c53b0647380