有了 Promise 和 then,為什麼還要使用 async? 本文寫於 2020 年 5 月 13 日 最近代碼寫著寫著,我突然意識到一個問題——我們既然已經有了 Promise 和 then,為啥還需要 async 和 await? 這不是脫褲子放屁嗎? 比如說我們需要一段請求伺服器的代碼: ...
有了 Promise 和 then,為什麼還要使用 async?
本文寫於 2020 年 5 月 13 日
最近代碼寫著寫著,我突然意識到一個問題——我們既然已經有了 Promise 和 then,為啥還需要 async 和 await?
這不是脫褲子放屁嗎?
比如說我們需要一段請求伺服器的代碼:
new Promise((resolve, reject) => {
setTimeout(() => {
const res = '明月幾時有'
if (1 > 2) {
resolve(res)
} else {
reject('我不知道,把酒問青天吧')
}
}, 1500)
}).then(
(res) => {
console.log(`成功啦!結果是${res}`)
},
(err) => {
console.log(`失敗了。。。錯誤是${err}`)
}
)
如果看不懂,可以看我之前寫的一篇,什麼叫做 Promise?
這段代碼,簡潔漂亮,但是如果用上了 async 和 await,就需要寫成下麵這樣:
function ask() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const res = '明月幾時有'
if (1 > 2) {
resolve(res)
} else {
reject('我不知道,把酒問青天吧')
}
}, 1500)
})
}
async function test() {
try {
const res = await ask()
} catch (err) {
console.log(err)
}
}
test()
竟然還需要一個 try catch 來捕捉錯誤!越寫越像 Java 呀。
MDN 給我們了一些解釋:
如果你在代碼中使用了非同步函數,就會發現它的語法和結構會更像是標準的同步函數。
說白了,這種寫法的一部分原因,就是為了“討好” Java 和其他的一些程式員。
另一方面呢,也是增強可讀性,雖然說 async await 的寫法比較醜,但是毫無疑問,可讀性遠遠高於 Promise then。
最為重要的呢,是 Promise 可以無限嵌套,而 async await 只能處理一個 Promise,無法繼續嵌套。
所以一旦需要使用多次連續回調,async await 就乏力了。
其實也可以,通過 await 一個Promise.all()
來實現。
(完)