ES2017 标准引入了 async 函数,它就是 Generator 函数的语法糖。
async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。
Generator 函数是 ES6 提供的一种异步编程解决方案,调用 Generator 函数,会返回一个内部指针(即遍历器)g。这是 Generator 函数不同于普通函数的另一个地方,即执行它不会返回结果,返回的是指针对象。调用指针g的next方法,会移动内部指针(即执行异步任务的第一段),指向第一个遇到的yield语句。
async function fn(args) { // ... } // 等同于 function fn(args) { return spawn(function* () { // ... }); }
下面给出spawn函数的实现:
function spawn(genF) { return new Promise(function(resolve, reject) { const gen = genF(); function step(nextF) { let next; try { next = nextF(); } catch(e) { return reject(e); } if(next.done) { return resolve(next.value); } Promise.resolve(next.value).then(function(v) { step(function() { return gen.next(v); }); }, function(e) { step(function() { return gen.throw(e); }); }); } step(function() { return gen.next(undefined); }); }); }
Related Posts
- npm ERR! gyp verb `which` failed Error: not found: python
- c++ ‘-DNODE_GYP_MODULE_NAME=libsass’ ‘-DUSING_UV_SHARED=1’ ‘-
- Sublime Text 自动换行
- Failed to change timestamp of the file in IntelliJ IDEA
- macOS中staff和wheel是什么?
- #1698 – Access denied for user ‘root’@’localhost’
- Warning in ./libraries/plugin_interface.lib.php#551
- ERROR 1067 (42000): Invalid default value for ‘created_at’
- Warning in ./libraries/sql.lib.php#613 count(): Parameter must be an array or an object that implements Countable