<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 亚洲精品国产高清嫩草影院 | 青青草国产免费国产是公开| 久9这里精品免费视频| 亚洲免费一区二区| 理论秋霞在线看免费| 四虎AV永久在线精品免费观看| 亚洲综合久久精品无码色欲| 国产精品怡红院永久免费| 337p日本欧洲亚洲大胆艺术| 成全动漫视频在线观看免费高清版下载| 亚洲精品视频在线观看你懂的| 免费精品久久久久久中文字幕| 国产成人3p视频免费观看| 亚洲av第一网站久章草| 日韩免费福利视频| 黄网站在线播放视频免费观看| 亚洲JIZZJIZZ中国少妇中文| 一个人免费观看www视频| 国产亚洲情侣一区二区无| 国产成人精品免费视频大全| 亚洲无线观看国产精品| a级片免费在线播放| 日韩va亚洲va欧洲va国产| 久久免费精彩视频| 亚洲国产精品成人精品小说 | 久久综合亚洲色HEZYO社区 | 国产一区二区三区在线免费观看| 狠狠综合亚洲综合亚洲色| 亚洲Av无码国产情品久久 | 中国人免费观看高清在线观看二区| 怡红院亚洲怡红院首页| 男女作爱在线播放免费网站| 亚洲日本国产精华液| 日韩高清在线高清免费| 中文字幕免费在线播放| 久久亚洲AV无码精品色午夜麻豆 | 亚洲人成在线免费观看| 成人性生免费视频| 免费激情网站国产高清第一页| 亚洲一级特黄大片无码毛片| 在线观看特色大片免费网站|