Async/Await的優(yōu)勢(shì)與缺憾[譯]

這可能會(huì)存在一些爭(zhēng)議菱父,據(jù)我所知 async/await 這個(gè)特性受到很多開(kāi)發(fā)者的青睞颈娜。對(duì)于不熟悉的同學(xué),簡(jiǎn)單講浙宜,其實(shí)它就是一種讓開(kāi)發(fā)者處理 Promise 更漂亮點(diǎn)兒的原生語(yǔ)法官辽。

async/await 寫法:

async function doSomethingCool() {
  let someValue = await getSomePromise();
  console.log(someValue + '!!!');
}

Promise 寫法:

function doSomethingCool() {
  getSomePromise.then(someValue => someValue + '!!!');
}

在上面的例子中,假定 getSomePromise 就是一個(gè)能夠返回 Promise 的函數(shù)粟瞬。

回憶過(guò)去

多年以前同仆, C# 迎來(lái)了 async、await 特性裙品,讓很多人興奮不已俗批,并號(hào)稱『讓異步編程更簡(jiǎn)單易懂』(至少我的同事們是這樣認(rèn)為的),因?yàn)樗摹汉?jiǎn)潔』導(dǎo)致很多人喜歡∈性酰現(xiàn)在 async扶镀、await 特性在 Javascript 也落地了,我也聽(tīng)到了同樣的聲音焰轻。但是我對(duì)此帶來(lái)的好處心存疑慮。

優(yōu)勢(shì)

  1. 之前需要很多函數(shù)組成的功能昆雀,現(xiàn)在只需要一個(gè)函數(shù)辱志。從視覺(jué)上就能感覺(jué)到復(fù)雜度降低了,之前需要 2n 個(gè)大括號(hào)的代碼狞膘,現(xiàn)在只需要2個(gè)足以揩懒。無(wú)論如何,會(huì)讓人感覺(jué)更簡(jiǎn)單些挽封。
  2. 語(yǔ)法后面不用再加 then 鏈?zhǔn)交卣{(diào)函數(shù)已球。對(duì)于大多數(shù)人來(lái)說(shuō),Promise 和函數(shù)式編程有個(gè)巨大的轉(zhuǎn)變就是鏈?zhǔn)交卣{(diào)函數(shù)辅愿。說(shuō)實(shí)話智亮,有些人很難處理這些回調(diào)。
  3. try/catch 使 async 語(yǔ)法的異常捕獲更加好用点待。這可能是 async阔蛉、await 帶來(lái)我最喜歡的特性。使得 Promise 的異常錯(cuò)誤處理像『常規(guī) javascript』一樣癞埠,例如:
let bad = () => Promise.reject('bad');
async function coolWay() {
  try {
    let result = await bad();
    doSomething(result);
  } catch (err) {
    console.error('An error!');
  }
}

對(duì)比

let bad = () => Promise.reject('bad');
function lameOldWay() {
  bad()
    .then(doSomething)
    .then(null, err => console.error('An error!'));
}

在我看來(lái)状原,第一個(gè)示例很明顯的表示了 catch 塊會(huì)捕獲 bad()doSomething() 的任何異常聋呢,然而在第二個(gè)示例中,除非你非常熟悉 Promise 的語(yǔ)法颠区,不然你會(huì)很難發(fā)現(xiàn)在哪里捕獲異常削锰。盡管如此,這在一些人眼里并不算一個(gè)很大的問(wèn)題毕莱。

劣勢(shì)

  1. 之前需要很多函數(shù)組成的功能器贩,現(xiàn)在只需要一個(gè)函數(shù)。(你可能注意到這個(gè)在上面優(yōu)勢(shì)提到過(guò))當(dāng)多個(gè)函數(shù)合并成一個(gè)函數(shù)之后央串,會(huì)很難區(qū)分函數(shù)的事件磨澡。然而當(dāng)函數(shù)分開(kāi)使用的時(shí)候,會(huì)清晰的看到單個(gè)函數(shù)觸發(fā)的事件质和。
  2. 經(jīng)過(guò)編譯的代碼臃腫并丑陋稳摄。在當(dāng)前這個(gè)時(shí)期,如果你想使用 async/await饲宿,你就需要通過(guò) Babel 來(lái)進(jìn)行編譯才能執(zhí)行厦酬。問(wèn)題就是,當(dāng)你寫好了幾行代碼瘫想,編譯過(guò)后代碼將會(huì)是幾倍的代碼量仗阅。

用或者不用

你可以同時(shí)使用基于鏈?zhǔn)秸{(diào)用的 Promise ,也可以使用 async/await国夜,這都并沒(méi)有什么减噪。我不確定哪個(gè)更適合你,但是只要適應(yīng)場(chǎng)景并且能使代碼更可讀车吹,你就用吧筹裕!

總結(jié)

最好去深入了解 async/await,我敢打賭在大部分的應(yīng)用場(chǎng)景中你并不需要區(qū)分到底哪種方案語(yǔ)法更好窄驹,最重要的是去權(quán)衡哪個(gè)寫法更能讓你的代碼更『好看』朝卒,如果兩者都 ok ,那么我個(gè)人推薦使用 Promise 的鏈?zhǔn)秸{(diào)用的方法乐埠,因?yàn)樗?jiǎn)單直接抗斤,性能更好,編譯的出的代碼更少丈咐。然而瑞眼,強(qiáng)大的 async/await 能讓你更加自然的使用 try/catch。

翻譯原文: 《 async/await: It’s Good and Bad 》 —— Ben Lesh

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棵逊,一起剝皮案震驚了整個(gè)濱河市负拟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹河,老刑警劉巖掩浙,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花吟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厨姚,警方通過(guò)查閱死者的電腦和手機(jī)衅澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谬墙,“玉大人今布,你說(shuō)我怎么就攤上這事∈锰В” “怎么了部默?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)造虎。 經(jīng)常有香客問(wèn)我傅蹂,道長(zhǎng),這世上最難降的妖魔是什么算凿? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任份蝴,我火速辦了婚禮,結(jié)果婚禮上氓轰,老公的妹妹穿的比我還像新娘婚夫。我一直安慰自己,他們只是感情好署鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布案糙。 她就那樣靜靜地躺著,像睡著了一般靴庆。 火紅的嫁衣襯著肌膚如雪侍筛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天撒穷,我揣著相機(jī)與錄音,去河邊找鬼裆熙。 笑死端礼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的入录。 我是一名探鬼主播蛤奥,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼僚稿!你這毒婦竟也來(lái)了凡桥?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚀同,失蹤者是張志新(化名)和其女友劉穎缅刽,沒(méi)想到半個(gè)月后啊掏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衰猛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年迟蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡省。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娜睛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卦睹,到底是詐尸還是另有隱情畦戒,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布结序,位于F島的核電站障斋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏笼痹。R本人自食惡果不足惜配喳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凳干。 院中可真熱鬧晴裹,春花似錦、人聲如沸救赐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)经磅。三九已至泌绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間预厌,已是汗流浹背阿迈。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧叽,地道東北人苗沧。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像炭晒,于是被迫代替她去往敵國(guó)和親待逞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語(yǔ)言太重要网严。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的识樱,如果沒(méi)有異步編程,根本...
    呼呼哥閱讀 7,311評(píng)論 5 22
  • 簡(jiǎn)單介紹下這幾個(gè)的關(guān)系為方便起見(jiàn) 用以下代碼為例簡(jiǎn)單介紹下這幾個(gè)東西的關(guān)系, async 在函數(shù)聲明前使用asyn...
    _我和你一樣閱讀 21,224評(píng)論 1 24
  • 根據(jù)筆者的項(xiàng)目經(jīng)驗(yàn)怜庸,本文講解了從函數(shù)回調(diào)当犯,到 es7 規(guī)范的異常處理方式。異常處理的優(yōu)雅性隨著規(guī)范的進(jìn)步越來(lái)越高休雌,...
    黃子毅閱讀 8,565評(píng)論 7 37
  • 原文鏈接:https://hackernoon.com/6-reasons-why-javascripts-asy...
    faremax閱讀 369評(píng)論 0 0
  • 左右衛(wèi)門坐在大師兩側(cè) 大師突然放了一個(gè)屁 右衛(wèi)門想灶壶,“ 如果世界是假的那么這是真的如果世界是真的那么大師身邊多了兩...
    某右衛(wèi)門閱讀 293評(píng)論 0 1