本章跟大家介紹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)不能在返回表達式的箭頭函數中設定斷點
2)如果你在.then程式碼區塊中設定斷點,使用Step Over快捷鍵,偵錯器不會跳到下一個.then,因為它只會跳過非同步程式碼。
使用await/async時,你不再需要那麼多箭頭函數,這樣你就可以像調試同步程式碼一樣跳過await語句
結論
Async/Await是近年來JavaScript添加的最革命性的特性之一。它會讓你發現Promise的語法有多糟糕,而且提供了一個直覺的替代方法。
憂慮
#對於Async/Await,也許你有一些合理的懷疑:
它使得非同步程式碼不在明顯: 我們已經習慣了用回調函數或.then來識別非同步程式碼,我們可能需要花數個星期去習慣新的標誌。但是,C#擁有這個特性已經很多年了,熟悉它的朋友應該知道暫時的稍微不方便是值得的。
Node 7不是LTS(長期支援版本): 但是,Node 8下個月就會發布,將程式碼遷移到新版本會非常簡單。
以上是js非同步回呼Async/Await與Promise的區別,Async/Await取代Promise的6個理由的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器