实现一个简单的co函数
2020-03-04 本文已影响0人
葶寳寳
co
是Generator
函数的自动执行器。它会返回一个Promise
值。
co
为什么能自动执行Generator
函数?
其实就是递归的去调用Genertor
函数返回值的next
方法,让函数内部指针下移。
function run(gen){
let context = this;
return new Promise((resolve, reject) => {
if (typeof gen === 'function') gen = gen.call(context);
if (!gen || typeof gen.next !== 'function') return resolve(gen);
onFulFilled();
function onFulFilled(res) {
var ret;
try {
ret = gen.next(res);
} catch(err) {
return reject(err);
}
next(ret);
}
function next(data) {
if(data.done) resolve(data.value);
let value = toPromise.call(context, data.value);
if(value && isPromise(value)) {
return value.then(onFulFilled, onRejected);
}
return function onRejected() {
reject(new TypeError('Error ', data.value));
}
}
})
}