我试图过滤一个生成器,并期望这种通用功能必须在 JavaScript 中的任何地方定义,因为它是为数组定义的,但我找不到它。所以我试图定义它。但我无法扩展内置生成器。
我有一个示例生成器
function make_nums ()
{
let nums = {};
nums[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
return nums;
}
Run Code Online (Sandbox Code Playgroud)
生成一些数字。
[...make_nums()] // => Array [ 1, 2, 3 ]
Run Code Online (Sandbox Code Playgroud)
如果我构建一个数组,我可以通过使用数组的filter函数来过滤数组。
[...make_nums()].filter(n => n > 1) // => Array [ 2, 3 ]
Run Code Online (Sandbox Code Playgroud)
但我不想建立一个数组。相反,我想使用旧的生成器并构建一个新的过滤生成器。为此,我编写了以下函数。
function filtered (generator, filter)
{
let g = {};
g[Symbol.iterator] = function* () {
for (let value of generator)
if (filter(value))
yield value;
};
return g;
} …Run Code Online (Sandbox Code Playgroud) 有时我想使用 RxJS 运算符来操作无限的异步迭代而不缓冲值。将可迭代对象转换为可观察对象很容易。以下将 Observable 转换为异步可迭代的方法是否有缺点?
const iterable = async function* (observable) {
let buffer = [],
resolve,
reject;
const subscription = observable.subscribe({
next: value => {
if (resolve) {
resolve(value);
resolve = reject = undefined;
} else {
buffer.push(Promise.resolve(value));
}
},
error: e => {
if (reject) {
reject(e);
resolve = reject = undefined;
}
},
complete: () => {},
});
while (!subscription.isStopped || buffer.length) {
yield buffer.shift() ||
new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject; …Run Code Online (Sandbox Code Playgroud)