這可能會(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ì)
- 之前需要很多函數(shù)組成的功能昆雀,現(xiàn)在只需要一個(gè)函數(shù)辱志。從視覺(jué)上就能感覺(jué)到復(fù)雜度降低了,之前需要 2n 個(gè)大括號(hào)的代碼狞膘,現(xiàn)在只需要2個(gè)足以揩懒。無(wú)論如何,會(huì)讓人感覺(jué)更簡(jiǎn)單些挽封。
- 語(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)。 - 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ì)
- 之前需要很多函數(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ā)的事件质和。
- 經(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。