js generator和yield
JS Generator yield
2023-09-14 08:58:44 时间
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]
});
函数返回 IterableIterator
export function iter_unpack() {
const arr = ["a", "b", "c"];
return {
next() {
const value = arr.shift();
return { value, done: !value };
},
[Symbol.iterator](): IterableIterator<any> {
return this;
},
};
}
const r = iter_unpack();
for (const i of r) {
console.log(i); // 分别打印 a,b,c
}
迭代class可以实现[Symbol.iterator]函数
export class ClassList implements ArrayLike<string> {
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.length) {
return {
done: false,
value: this[index++],
};
} else {
return {
done: true,
};
}
},
};
}
}
相关文章
- [Web 前端] React Js img 图片显示默认 占位符
- JS框架_(JQuery.js)模拟刮奖
- JS框架_(JQuery.js)圆形多选菜单选项
- JS框架_(JQuery.js)网页文字评论弹幕
- JS框架_(Popup.js)3D对话框窗口插件
- JS框架_(Qrcode.js)将你的内容转换成二维码格式
- 一眼毁三观:JS中不为人知的五种声明Number的方式
- JS魔法堂:IE5~9的Drag&Drop API
- baguetteBox.js响应式画廊插件(纯JS)
- JS日期工具类(转)
- js表单的focus()与blur()方法
- [Javascript] Deep merge in Javascript with Ramda.js mergeDeepWith
- 文本框文字处理工具类js+代码高亮组件
- [Vue] Use Vue.js Component Computed Properties
- Atitit js es5 es6新特性 attilax总结
- Atitit 深入理解命名空间namespace java c# php js
- atitit.判断时间重叠方法总结 java c++ c#.net js php
- 华为OD机试 - 最差产品奖(Java & JS & Python)
- js div禁止点击,恢复点击(jquery)
- 详解JS中 call 方法的实现
- 【JS高级】js之闭包对象_04
- 【JS高级】js之正则相关函数以及正则对象_02
- 对Node.js 的理解?优缺点?应用场景?
- 2022年11月21日13:32:00——T5——JS对象与Date日期函数