成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

盤點JavaScript中Async/Await知識

開發 前端
Async/await 是以更舒適的方式使用 promise 的一種特殊語法,同時它也非常易于理解和使用。

[[412197]]

大家好,我是進階學習者。

一、前言

Async/await 是以更舒適的方式使用 promise 的一種特殊語法,同時它也非常易于理解和使用。

二、Async function

讓以 async 這個關鍵字開始。它可以被放置在一個函數前面。

如下所示:

  1. async function f() { 
  2.   return 1; 

在函數前面的 “async” 這個單詞表達了一個簡單的事情:即這個函數總是返回一個 promise。其他值將自動被包裝在一個 resolved 的 promise 中。

例如,下面這個函數返回一個結果為 1 的 resolved promise。

讓測試一下:

  1. async function f() { 
  2.   return 1; 
  3. f().then(alert); // 1 

也可以顯式地返回一個 promise,結果是一樣的:

  1. async function f() { 
  2.   return Promise.resolve(1); 
  3. f().then(alert); // 1 

注:

async 確保了函數返回一個 promise,也會將非 promise 的值包裝進去。很簡單,對吧?但不僅僅這些。還有另外一個叫 await 的關鍵詞,它只在 async 函數內工作,也非常酷。

三、Await

1. 語法

  1. // 只在 async 函數內工作 
  2. let value = await promise; 

關鍵字 await 讓 JavaScript 引擎等待直到 promise 完成(settle)并返回結果。

這里的例就是一個 1 秒后 resolve 的 promise:

  1. async function f() { 
  2.   let promise = new Promise((resolve, reject) => { 
  3.     setTimeout(() => resolve("done!"), 1000) 
  4.   }); 
  5.   let result = await promise; // 等待,直到 promise resolve (*) 
  6.   alert(result); // "done!" 
  7. f(); 

代碼解析:

這個函數在執行的時候,“暫停”在了 (*) 那一行,并在 promise settle 時,拿到 result 作為結果繼續往下執行。所以上面這段代碼在一秒后顯示 “done!”。

await 字面的意思就是讓 JavaScript 引擎等待直到 promise settle,然后以 promise 的結果繼續執行。這個行為不會耗費任何 CPU 資源,因為引擎可以同時處理其他任務:執行其他腳本,處理事件等。

相比于 promise.then,它只是獲取 promise 的結果的一個更優雅的語法,同時也更易于讀寫。

不能在普通函數中使用 await。

如果嘗試在非 async 函數中使用 await 的話,就會報語法錯誤:

  1. function f() { 
  2.   let promise = Promise.resolve(1); 
  3.   let result = await promise; // Syntax error 

如果函數前面沒有 async 關鍵字,就會得到一個語法錯誤。就像前面說的,await 只在 async 函數 中有效。

showAvatar() 例子,并將其改寫成 async/await 的形式:

需要用 await 替換掉 .then 的調用。

另外,需要在函數前面加上 async 關鍵字,以使它們能工作。

  1. async function showAvatar() { 
  2.   // 讀取的 JSON 
  3.   let response = await fetch('/article/promise-chaining/user.json'); 
  4.   let user = await response.json(); 
  5.   // 讀取 github 用戶信息 
  6.   let githubResponse = await fetch(`https://api.github.com/users/${user.name}`); 
  7.   let githubUser = await githubResponse.json(); 
  8.   // 顯示頭像 
  9.   let img = document.createElement('img'); 
  10.   img.src = githubUser.avatar_url; 
  11.   img.className = "promise-avatar-example"
  12.   document.body.append(img); 
  13.   // 等待 3 秒 
  14.   await new Promise((resolve, reject) => setTimeout(resolve, 3000)); 
  15.   img.remove(); 
  16.   return githubUser; 
  17. showAvatar(); 

簡潔明了,是吧?比之前可強多了。await 不能在頂層代碼運行。

這有一個用于演示的 Thenable 類

下面的 await 接受了該類的例子:

  1. class Thenable { 
  2.   constructor(num) { 
  3.     this.num = num; 
  4.   } 
  5.   then(resolve, reject) { 
  6.     alert(resolve); 
  7.     // 1000ms 后使用 this.num*2 進行 resolve 
  8.     setTimeout(() => resolve(this.num * 2), 1000); // (*) 
  9.   } 
  10. }; 
  11. async function f() { 
  12.   // 等待 1 秒,之后 result 變為 2 
  13.   let result = await new Thenable(1); 
  14.   alert(result); 
  15. f(); 

運行結果:

注:

如果 await 接收了一個非 promise 的但是提供了 .then 方法的對象,它就會調用這個 .then 方法,并將內建的函數 resolve 和 reject 作為參數傳入(就像它對待一個常規的 Promise executor 時一樣)。

然后 await 等待直到這兩個函數中的某個被調用(在上面這個例子中發生在 (*) 行),然后使用得到的結果繼續執行后續任務。

2. Class 中的 async 方法

要聲明一個 class 中的 async 方法,只需在對應方法前面加上 async 即可:

  1. class Waiter { 
  2.   async wait() { 
  3.     return await Promise.resolve(1); 
  4.   } 
  5. new Waiter() 
  6.   .wait() 
  7.   .then(alert); // 1 

運行結果:

注:

它確保了方法的返回值是一個 promise 并且可以在方法中使用 await。

四、總結

本文基于JavaScript基礎,介紹了async的使用。函數前面的關鍵字 async 有兩個作用:讓這個函數總是返回一個 promise。允許在該函數內使用 await。

這兩個關鍵字一起提供了一個很好的用來編寫異步代碼的框架,這種代碼易于閱讀也易于編寫。通過案例的分分析,圖文結合的方式,進行詳細的講解,使用JavaScript語言,能夠讓讀者更好的理解。 

代碼很簡單,希望能夠幫助你更好的學習。

 

責任編輯:武曉燕 來源: 前端進階學習交流
相關推薦

2016-11-22 11:08:34

asyncjavascript

2021-06-07 09:44:10

JavaScript開發代碼

2021-06-28 08:10:59

JavaScript異步編程

2024-09-02 14:12:56

2022-11-21 09:01:00

Swift并發結構

2021-08-26 10:25:04

JavaScript進階操作 前端

2021-08-30 10:25:48

JavaScript進階操作前端

2014-07-15 10:31:07

asyncawait

2012-07-22 15:59:42

Silverlight

2023-10-08 10:21:11

JavaScriptAsync

2023-07-28 07:31:52

JavaScriptasyncawait

2024-12-30 08:22:35

2021-06-28 07:27:43

AwaitAsync語法

2022-08-27 13:49:36

ES7promiseresolve

2017-06-19 09:12:08

JavaScriptPromiseAsync

2024-12-23 08:00:45

2022-06-13 07:36:47

useEffectHooks

2021-06-15 05:36:45

Gulpawaitasync

2017-02-20 23:05:14

JavaScript

2017-04-10 15:57:10

AsyncAwaitPromise
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av一区二区三区四区 | 欧美精品福利视频 | 国产精品69毛片高清亚洲 | 亚洲国产成人精品女人久久久 | 99久久国产精 | 亚洲一区影院 | 国产三级一区二区三区 | 国产在线观看一区二区 | 国产福利视频在线观看 | 日韩在线观看一区二区三区 | 中文字幕在线观看一区 | 久久精品视频一区二区三区 | 97伦理| 91精品一区二区三区久久久久久 | 亚洲va欧美va天堂v国产综合 | 日韩高清www | 国产精品国产亚洲精品看不卡15 | 中文字幕在线看第二 | 日韩视频一区二区三区 | 日韩欧美电影在线 | 国产精品久久久久久久久久久久久 | 精品亚洲一区二区三区 | 一级片成人 | 日韩电影中文字幕 | 国产精品久久久久久久久久久久午夜片 | 午夜电影福利 | 国产精品亚洲精品日韩已方 | 久久久久99| 噜噜噜色网 | 午夜精品久久久久久久久久久久久 | 日韩不卡在线 | 国产高清自拍视频在线观看 | 精品视频一区二区三区 | 国产成人精品免高潮在线观看 | 国产精品成人在线播放 | 精品国产一区二区在线 | 91tv在线观看 | 草久网| 国产日韩电影 | 欧美日韩电影一区 | 在线视频成人 |