• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由

    來源:懂視網 責編:小采 時間:2020-11-27 19:30:46
    文檔

    js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由

    js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由:本章給大家介紹js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由。有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。什么是Async/Awaitasync/await是寫異步代碼的新方式,以前的方法有回調函數和Promise。as
    推薦度:
    導讀js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由:本章給大家介紹js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由。有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。什么是Async/Awaitasync/await是寫異步代碼的新方式,以前的方法有回調函數和Promise。as
    本章給大家介紹js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由。有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

    什么是Async/Await?

    async/await是寫異步代碼的新方式,以前的方法有回調函數和Promise。

    async/await是基于Promise實現的,它不能用于普通的回調函數。

    async/await與Promise一樣,是非阻塞的。

    async/await使得異步代碼看起來像同步代碼,這正是它的魔力所在。

    Async/Await語法

    示例中,getJSON函數返回一個promise,這個promise成功resolve時會返回一個JSON對象。我們只是調用這個函數,打印返回的JSON對象,然后返回"done"。

    使用Promise是這樣的:

    const makeRequest = () =>
     getJSON()
     .then(data => {
     console.log(data)
     return "done"
     })makeRequest()

    使用Async/Await是這樣的:

    const makeRequest = async () => {
     console.log(await getJSON())
     return "done"}makeRequest()

    它們有一些細微不同:

    函數前面多了一個aync關鍵字。await關鍵字只能用在aync定義的函數內。async函數會隱式地返回一個promise,該promise的reosolve值就是函數return的值。(示例中reosolve值就是字符串"done")

    第1點暗示我們不能在最外層代碼中使用await,因為不在async函數內。

    // 不能在最外層代碼中使用
    awaitawait makeRequest()
    // 這是會出事情的 
    makeRequest().then((result) => {
     // 代碼
     })

    await getJSON()表示console.log會等到getJSON的promise成功reosolve之后再執行。

    為什么Async/Await更好?

    1. 簡潔

    由示例可知,使用Async/Await明顯節約了不少代碼。我們不需要寫.then,不需要寫匿名函數處理Promise的resolve值,也不需要定義多余的data變量,還避免了嵌套代碼。這些小的優點會迅速累計起來,這在之后的代碼示例中會更加明顯。

    2. 錯誤處理

    Async/Await讓try/catch可以同時處理同步和異步錯誤。在下面的promise示例中,try/catch不能處理JSON.parse的錯誤,因為它在Promise中。我們需要使用.catch,這樣錯誤處理代碼非常冗余。并且,在我們的實際生產代碼會更加復雜。

    const makeRequest = () => {
     try {
     getJSON()
     .then(result => {
     // JSON.parse可能會出錯
     const data = JSON.parse(result)
     console.log(data)
     })
     // 取消注釋,處理異步代碼的錯誤
     // .catch((err) => {
     // console.log(err)
     // })
     } catch (err) {
     console.log(err)
     }}

    使用aync/await的話,catch能處理JSON.parse錯誤:

    const makeRequest = async () => {
     try {
     // this parse may fail
     const data = JSON.parse(await getJSON())
     console.log(data)
     } catch (err) {
     console.log(err)
     }}

    3. 條件語句

    下面示例中,需要獲取數據,然后根據返回數據決定是直接返回,還是繼續獲取更多的數據。·

    const makeRequest = () => {
     return getJSON()
     .then(data => {
     if (data.needsAnotherRequest) {
     return makeAnotherRequest(data)
     .then(moreData => {
     console.log(moreData)
     return moreData })
     } else {
     console.log(data)
     return data }
     })}

    這些代碼看著就頭痛。嵌套(6層),括號,return語句很容易讓人感到迷茫,而它們只是需要將最終結果傳遞到最外層的Promise。

    上面的代碼使用async/await編寫可以大大地提高可讀性:

    const makeRequest = async () => {
     const data = await getJSON()
     if (data.needsAnotherRequest) {
     const moreData = await makeAnotherRequest(data);
     console.log(moreData)
     return moreData } else {
     console.log(data)
     return data 
     }}

    4. 中間值

    你很可能遇到過這樣的場景,調用promise1,使用promise1返回的結果去調用promise2,然后使用兩者的結果去調用promise3。你的代碼很可能是這樣的:

    const makeRequest = () => {
     return promise1()
     .then(value1 => {
     return promise2(value1)
     .then(value2 => { 
     return promise3(value1, value2)
     })
     })}

    如果promise3不需要value1,可以很簡單地將promise嵌套鋪平。如果你忍受不了嵌套,你可以將value 1 & 2 放進Promise.all來避免深層嵌套:

    const makeRequest = () => {
     return promise1()
     .then(value1 => {
     return Promise.all([value1, promise2(value1)])
     })
     .then(([value1, value2]) => { 
     return promise3(value1, value2)
     })}

    這種方法為了可讀性犧牲了語義。除了避免嵌套,并沒有其他理由將value1和value2放在一個數組中。

    使用async/await的話,代碼會變得異常簡單和直觀。

    const makeRequest = async () => {
     const value1 = await promise1()
     const value2 = await promise2(value1)
     return promise3(value1, value2)}

    5. 錯誤棧

    下面示例中調用了多個Promise,假設Promise鏈中某個地方拋出了一個錯誤:

    const makeRequest = () => {
     return callAPromise()
     .then(() => callAPromise())
     .then(() => callAPromise())
     .then(() => callAPromise())
     .then(() => callAPromise())
     .then(() => {
     throw new Error("oops");
     })}makeRequest()
     .catch(err => {
     console.log(err);
     // output
     // Error: oops at callAPromise.then.then.then.then.then (index.js:8:13)
     })

    Promise鏈中返回的錯誤棧沒有給出錯誤發生位置的線索。更糟糕的是,它會誤導我們;錯誤棧中唯一的函數名為callAPromise,然而它和錯誤沒有關系。(文件名和行號還是有用的)。

    然而,async/await中的錯誤棧會指向錯誤所在的函數:

    const makeRequest = async () => {
     await callAPromise()
     await callAPromise()
     await callAPromise()
     await callAPromise()
     await callAPromise()
     throw new Error("oops");}makeRequest()
     .catch(err => {
     console.log(err);
     // output
     // Error: oops at makeRequest (index.js:7:9)
     })

    在開發環境中,這一點優勢并不大。但是,當你分析生產環境的錯誤日志時,它將非常有用。這時,知道錯誤發生在makeRequest比知道錯誤發生在then鏈中要好。

    6. 調試

    最后一點,也是非常重要的一點在于,async/await能夠使得代碼調試更簡單。2個理由使得調試Promise變得非常痛苦:

    1)不能在返回表達式的箭頭函數中設置斷點

    1.jpg

    2)如果你在.then代碼塊中設置斷點,使用Step Over快捷鍵,調試器不會跳到下一個.then,因為它只會跳過異步代碼。

    使用await/async時,你不再需要那么多箭頭函數,這樣你就可以像調試同步代碼一樣跳過await語句

    2.jpg

    結論

    Async/Await是近年來JavaScript添加的最革命性的的特性之一。它會讓你發現Promise的語法有多糟糕,而且提供了一個直觀的替代方法。

    憂慮

    對于Async/Await,也許你有一些合理的懷疑:
    它使得異步代碼不在明顯: 我們已經習慣了用回調函數或者.then來識別異步代碼,我們可能需要花數個星期去習慣新的標志。但是,C#擁有這個特性已經很多年了,熟悉它的朋友應該知道暫時的稍微不方便是值得的。
    Node 7不是LTS(長期支持版本): 但是,Node 8下個月就會發布,將代碼遷移到新版本會非常簡單。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由

    js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由:本章給大家介紹js異步回調Async/Await與Promise的區別,Async/Await替代Promise的6個理由。有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。什么是Async/Awaitasync/await是寫異步代碼的新方式,以前的方法有回調函數和Promise。as
    推薦度:
    標簽: 理由 js 回調
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日韩精品无码熟人妻视频| 久久国产精品成人影院| 久久久久这里只有精品| 国产精品久久国产精麻豆99网站 | 国产精品亚洲片在线| 精品久久久久中文字| 久久亚洲国产精品一区二区| 亚洲AV无码成人网站久久精品大 | 成人国内精品久久久久影院| 日本国产精品久久| 国产精品青草视频免费播放| 国语自产少妇精品视频| 亚洲精品97久久中文字幕无码| 91精品国产福利在线观看| 国产高清在线精品二区一| 欧美性videos高清精品| 香蕉依依精品视频在线播放| 精品国产污污免费网站入口在线| 四虎国产精品永久地址99| CAOPORM国产精品视频免费| 久久精品中文字幕无码绿巨人| 亚洲国产精品成人午夜在线观看| 精品亚洲欧美无人区乱码| 国产精品1024视频| 一本一道久久精品综合| 久久免费精品视频| 老司机国内精品久久久久| 久久精品国产69国产精品亚洲| 97久久超碰国产精品2021| 国产精品色内内在线播放| 精品国产粉嫩内射白浆内射双马尾 | 乱精品一区字幕二区| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 免费91麻豆精品国产自产在线观看| 国产精品久久久久久吹潮| 久久精品国产亚洲AV无码娇色| 老司机性色福利精品视频| 国产亚洲精品资源在线26u| 97久久国产亚洲精品超碰热| 国产精品美女久久久| 国产一成人精品福利网站|