【问题标题】:How to sequentially combine two sync iterators in JavaScript?如何在 JavaScript 中顺序组合两个同步迭代器?
【发布时间】:2021-09-29 22:08:15
【问题描述】:

假设我们有两个异步迭代器,

const asyncIterable1 = {
  [Symbol.asyncIterator]() {
    return {
      i: 0,
      next() {
      if (this.i < 3) {
        return Promise.resolve({ value: this.i++, done: false });
      }

      return Promise.resolve({ done: true });
    }
  };
 }
};

const asyncIterable2 = {
  [Symbol.asyncIterator]() {
    return {
      i: 3,
      next() {
      if (this.i < 5) {
        return Promise.resolve({ value: this.i++, done: false });
      }

      return Promise.resolve({ done: true });
    }
  };
 }
};

现在,有没有一种方法可以将这两个迭代器组合成一个迭代器,返回一个由 0,1,2 和 3,4 组成的序列?

【问题讨论】:

  • @Andreas 抱歉!我错过了

标签: javascript asynchronous iterator


【解决方案1】:

是的,我会为此使用yield*

    const combine = (a, b) => (function* () { yield* a; yield* b; })();
    
    const iterator = combine(
      (function* () { yield 1; yield 2; })(),
      (function* () { yield 3; yield 4; })()
    );
    
    console.log(iterator.next(), iterator.next(), iterator.next(), iterator.next(), iterator.next());

这与异步迭代器类似。但是,您将丢失第一个迭代器的返回值(“完成的产量”)。但是,您可以捕获它(值 yield* 评估为)。

当然,如果您是喜欢重新发明轮子的人之一,您也可以在不使用生成器功能的情况下“手动”实现此类功能:

function combine(...iterators) {
  let pos = 0, iterator = iterators[pos];
  return {
    next() {
      let result = { done: true };
      do {
        result = iterator.next();
        if(!result.done) break;
        iterator = iterators[ pos++ ];
      } while(iterator)
          
      return result;
    }
  };
}

 const iterator = combine(
          (function* () { yield 1; yield 2; })(),
          (function* () { yield 3; yield 4; })()
 );
        
 console.log(iterator.next(), iterator.next(), iterator.next(), iterator.next(), iterator.next());

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

除了 Jonas 的出色回答之外,我们还可以进一步概括并组合任意数量的迭代器:

let combine = function*(...iterators) {
  for (let it of iterators) yield* it;
};

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2013-03-11
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多