Async/await:是一個用同步思維解決異步問題的方案
1.會自動將常規函數轉換成Promise,返回值也是一個Promise對象
2.只有async函數內部的異步操作執行完,才會執行then方法指定的回調函數
3.異步函數內部可以使用await
4.await 放置在Promise調用之前,await 強制后面點代碼等待,直到Promise對象resolve,得到resolve的值作為await表達式的運算結果
5.await只能在async函數內部使用,用在普通函數里就會報錯
和Promise相比較
相同點:
為了解決異步流程問題,promise是約定,而async更優雅
區別:
1.Promise是ES6,而async是ES7
2.Promise原來有規范的意義,Promise a,b,c,d 等規范,最終確定的是Promise a+ 規范
3.Promise鏈式操作,自己catch異常。async則要在函數內catch,好在現在catch成本較低
4.Promise有很多並行神器,比如Promise.all\Promise.race等。這些是async沒法搞定的
5.Promise是顯式的異步,而 Async/await 讓你的代碼看起來是同步的,你依然需要注意異步
6.Promise即使不支持es6,你依然可以用promise的庫或polyfil,而async就很難做,當然也不是不能,成本會高很多
7.async functions 和Array.forEach等結合,很多tc39提案都在路上或者已經實現,處於上升期,而promise也就那樣了
總結:Async/awati 簡單好用,是大勢,肯定得學,而async的使用繞不開Promise,所以Promise是必會的。