相关疑难解决方法(0)

如何扩展 Generator 类?

我试图过滤一个生成器,并期望这种通用功能必须在 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)

javascript generator ecmascript-6

7
推荐指数
2
解决办法
695
查看次数

将 RxJS Observable 转换为异步可迭代

有时我想使用 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)

javascript asynchronous iterable observable rxjs

6
推荐指数
0
解决办法
1283
查看次数