先看 async / await 异步解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function sleep(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms); }); }
async function test() { for (let i = 0; i < 100; i++) { await sleep(100); } }
|
通过 babel 编译成 Generator 与 Promise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then( function (value) { return step('next', value); }, function (err) { return step('throw', err); } ); } } return step('next'); }); }; } function sleep(ms) { return new Promise((resolve, reject) => { setTimeout(resolve, ms); }); } let test = (function () { var ref = _asyncToGenerator(function* () { for (let i = 0; i < 100; i++) { yield sleep(100); } }); return function test() { return ref.apply(this, arguments); }; })();
|
从上相关直观的看出来如何使用 Generator
与 Promise
进行的异步解决方案。