用最少的代码实现 co 框架
在 async 正式得到支持之后,co 框架也慢慢被淘汰了,不过作为学习用途,还是有所意义的。 下面的代码改良自 tslib,用最少的代码实现 co 框架:
/**
* @param {GeneratorFunction} gen
*/
function co(gen) {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(gen.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(gen.throw(value));
} catch (e) {
reject(e);
}
};
var step = (result) => {
result.done ? resolve(result.value)
: Promise.resolve(result.value).then(fulfilled, rejected);
};
step((gen = gen()).next());
});
}