国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
主站蜘蛛池模板: 亚洲视频在线观看视频 | 亚洲国产成人久久一区www妖精 | 亚洲男同在线观看 | 日韩视频免费 | 国产精品天天看大片特色视频 | 国产欧美日韩综合精品无毒 | 国产毛片一区二区三区精品 | 欧美日韩国产亚洲一区二区三区 | 亚洲性久久久影院 | 国产人成久久久精品 | 全免费a级毛片免费看不卡 日本二区在线观看 | 一级毛片一级毛片一级级毛片 | 日韩在线无 | 91精品国产91热久久p | 国产精品久久久久久久毛片 | 亚洲国产精品婷婷久久 | 国产区免费在线观看 | 国产丰满眼镜女在线观看 | 黄a毛片 | 国产精选在线观看 | 亚洲国产精品免费视频 | 在线 v亚洲 v欧美v 专区 | 国产日韩一区二区三区在线播放 | 视频一区二区三区在线 | 日产精品久久久一区二区 | 欧美日韩亚洲天堂 | 久久超级碰 | 日本不卡视频一区二区 | 欧美 亚洲 中文字幕 | 黄色毛片免费在线观看 | 亚洲视频免费观看 | 不卡一级aaa全黄毛片 | 国产一级视频在线观看 | 亚洲国产激情一区二区三区 | 一区二区三区免费 | 国产精品美女久久久久 | 国产精品亚洲欧美一级久久精品 | 日韩激情影院 | 精品日韩欧美一区二区三区 | 亚洲第一网站在线观看 | 欧美日韩高清在线 |