function co<T>(fn: () => Generator<any, any, any>): Promise<T> {
const g: Generator = fn();
return new Promise((resolve, reject) => {
const r = g.next();
_next(r, resolve);
});
function _next(v: IteratorResult<any, any>, done: any): any {
if (v.done) {
return done(v.value);
}
const isArray = Array.isArray(v.value);
Promise.all(isArray ? v.value : [v.value]).then((value) => {
const r: IteratorResult<any, any> = g.next(isArray ? value : value[0]);
return _next(r, done);
});
}
}
// 返回promise数据
function getData(): Promise<any> {
return Promise.resolve({ name: "ajanuw" });
}
// 返回generator数据
function* getData2(): Generator<any, any, any> {
return yield { code: 1 };
}
co(function* (): Generator<any, any, any> {
// next(value) == r1
const r1 = yield 1; // 当执行next()时获取的返回值1
const r2 = yield getData();
const r3 = yield* getData2() as any;
return [r1, r2, r3];
}).then((r) => {
console.log(r); // 1 {name: "ajanuw"} {code: 1}
});
co(function* () {
// resolve multiple promises in parallel
var a = Promise.resolve(1);
var b = Promise.resolve(2);
var c = Promise.resolve(3);
var res = yield [a, b, c];
console.log(res);
// => [1, 2, 3]
});
处理 generator和yield
猜你喜欢
转载自www.cnblogs.com/ajanuw/p/12677955.html
今日推荐
周排行