您好,登錄后才能下訂單哦!
關于async的介紹,在阮一峰的ES6入門教程中說到:
async 函數是什么?一句話,它就是 Generator 函數的語法糖。
可是,為什么這么說呢?
首先,比如說有一個異步操作,使用 async/await 語法來以同步模擬異步操作。
使用 async/await 實現一個 sleep 的功能
function sleep(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(1); }, time); }); } async function test () { for(let i = 0; i < 10; i++) { let result = await sleep(1000); console.log(result); } }
將 async/await 轉成 generator 和 promise 來實現:
let test = function () { // ret 為一個Promise對象,因為ES6語法規定 async 函數的返回值必須是一個 promise 對象 let ret = _asyncToGenerator(function* () { for (let i = 0; i < 10; i++) { let result = yield sleep(1000); console.log(result); } }); return ret; }(); // generator 自執行器 function _asyncToGenerator(genFn) { return new Promise((resolve, reject) => { let gen = genFn(); function step(key, arg) { let info = {}; try { info = gen[key](arg); } catch (error) { reject(error); return; } if (info.done) { resolve(info.value); } else { return Promise.resolve(info.value).then((v) => { return step('next', v); }, (error) => { return step('throw', error); }); } } step('next'); }); }
看完以上代碼,是不是一目了然了啊。將 async/await 使用 generator 進行改寫的關鍵是要使用 promise 來實現一個 generator 自執行器。在babel中,大體的原理也是類似的。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。