有了 Promise 和 then,為什么還要使用 async?


有了 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()來實現。

(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM