Async/await
的主要益處是可以避免回撥地獄(callback hell)問題
Chromium JavaScript引擎 從v5.5開始支援async/await功能,Chromium JavaScript引擎版本號的檢視方法是:在瀏覽器位址列輸入 chrome://version,查詢出來的資訊如下圖所示:
這意味著async/await
不再是實驗性功能,使用它時無需指定--harmony
引數,此引數用來開啟那些幾乎已完成但被V8團隊認為還不穩定的功能。不同的node版本使用不同的V8引擎,檢視方式是:
Node.js 7.6正式預設支援async/await
功能
async-await語法介紹
在函式,匿名函式,箭頭函式,變數,類中加上關鍵字async就行了
async function asyncFunc() {} const asyncFunc = async function() {} async function() {} async () => {} class someClass { async asyncFunc() {} }
function前面加上async關鍵字,表示該function需要執行非同步程式碼。 async function函式體內可以使用await關鍵字,且await關鍵字只能出現在async function函式體內。
await關鍵字可以跟在任意變數或者表示式之前,await後面通常會跟一個非同步過程,如下
async function asyncFunc() { await somePromise; }
async function的返回值
async function固定會返回一個promise,即便函式體裡面沒有呼叫return。由於async function返回一個promise,所以可以寫在await後面,類似這樣
async function asyncFun1() {} async function asyncFun2() { await asyncFun1(); } async function asyncFun3() { await asyncFun2(); } asyncFun3();
等效於: async function asyncFun1() {} async function asyncFun2() {} async function asyncFun3() { await asyncFun1(); await asyncFun2(); } asyncFun3();
如果有return,return後面的值都會被包裝成一個promise執行正確的回撥函式,所以return 'foo'會被包裝成return Promise.resolve('foo')。
React中使用jQuery $.ajax Promise避免回撥地獄的語法
componentDidMount() { const self = this; // 獲取使用者名稱 $.ajax('get_my_name') .then(name => { // 根據使用者名稱獲取個人資訊 // 鏈式Promise return $.ajax(`get_my_info_by_name'?name=${name}`); }).then(function(info) { self.setSate({info}); }).catch(function(err) => { console.error(err); }); }
React中使用async,await的避免回撥地獄的語法
async componentDidMount() { try { // 獲取使用者名稱 const name = await $.ajax('get_my_name'); // 根據使用者名稱獲取個人資訊 const info = await $.ajax(`get_my_info_by_name'?name=${name}`); this.setSate({info}); } catch(err) { console.error(err); } }
可以看出,async,await的寫法更優雅
參考文章