Created
July 23, 2019 12:27
-
-
Save taikulawo/d74752d274c871093596e2a3151836d0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function step(iterator, resolve, reject, nextcall, throwcall, key, args) { | |
try { | |
var info = iterator[key](args) | |
var v = info.value | |
} catch (e) { | |
reject(e) | |
return | |
} | |
if (info.done) { | |
resolve(v) | |
return | |
} | |
// resolve 结果之后讲value传递给nextcall,继续下面调用 | |
Promise.resolve(v).then(nextcall, throwcall) | |
} | |
/** | |
* | |
* @param {fn 是生成器函数 } fn | |
*/ | |
function co(fn) { | |
return function () { | |
let self = this | |
let args = arguments | |
return new Promise(function (resolve, reject) { | |
// fn 是生成器函数,调用返回 iterator | |
let iterator = fn.apply(self, args) | |
function next(value) { | |
step(iterator, resolve, reject, next, throwFn, "next", value) | |
} | |
function throwFn(err) { | |
step(iterator, resolve, reject, next, throwFn, "throw", err) | |
} | |
next(undefined) | |
}) | |
} | |
} | |
module.exports = { | |
co | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment