Promise
Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案8i——回調函數(shù)和事件——更合理和更強大司忱,簡單地說氓奈,Promise好比容器痹籍,里面存放著一些未來才會執(zhí)行完畢(異步)的事件的結果瞬欧,而這些結果一旦生成是無法改變的
async await
async await也是異步編程的一種解決方案贷屎,他遵循的是Generator 函數(shù)的語法糖,他擁有內置執(zhí)行器艘虎,不需要額外的調用直接會自動執(zhí)行并輸出結果唉侄,它返回的是一個Promise對象。
await函數(shù)不能單獨使用野建,而且async函數(shù)返回的是一個Promise對象属划,可以使用then函數(shù)添加回調函數(shù)。當函數(shù)執(zhí)行的時候候生,一旦遇到await函數(shù)就會先返回一個Promise對象同眯,等到異步操作完成,再去執(zhí)行后面的語句唯鸭。如果 await 后面的異步操作出錯须蜗,那么等同于 async 函數(shù)返回的 Promise 對象被 reject
區(qū)別
1.提案版本不同:Promise是ES6的新特性,async目溉、await是ES7中的提案
2.代碼簡潔度:使用async函數(shù)可以讓代碼簡潔很多明肮;promise中,try/catch 不能處理 JSON.parse 的錯誤缭付,因為它在Promise中柿估。我們需要使用 .catch,這樣錯誤處理代碼非常冗余陷猫。
- 錯誤調試:Async/Await 讓 try/catch 可以同時處理同步和異步錯誤秫舌。如果 Promise 連續(xù)調用,對于錯誤的處理是很麻煩的烙丛。你無法知道錯誤出在哪里舅巷。
- 不能在返回表達式的箭頭函數(shù)中設置斷點
- 如果你在.then代碼塊中設置斷點,使用Step Over快捷鍵河咽,調試器不會跳到下一個.then钠右,因為它只會跳過異步代碼。
- 使用await/async時忘蟹,你不再需要那么多箭頭函數(shù)飒房,這樣你就可以像調試同步代碼一樣跳過await語句。