NodeJS 节点可读流中的重复调用?

hgb9j2n6  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(183)

问题是

因此,我有this code,一个Readable流,它逐页地从de DB读取移动,但由于某种原因,我得到了重复的记录。

const readMovements = new Readable({
        async read() {
          while (true) {
            const movements = await getMovements(page, perPage);

            if (movements.length) {
              const data = JSON.stringify(movements);

              page++;
              this.push(data);
            } else {
              break;
            }
          }

          this.push(null);
        },
      });

我的解决方案

然后我changed this,Readable变成了下面的异步生成器,不再有重复的记录

async function* readMovements() {
        while (true) {
          const movements = await getMovements(page, perPage);

          if (!movements.length) break;

          const data = JSON.stringify(movements);

          page++;
          yield data;
        }
      }

我的问题
有人知道为什么会这样吗?

  • 我想继续使用可读流,因为异步生成器代码运行速度比第一个版本慢。所以如果你有办法让它工作,请让我知道!
zfycwa2u

zfycwa2u1#

原因是每次资源准备好读取更多数据时都会调用read()方法,因此,每次调用read()时都会运行while循环(因此会出现重复调用)。
通过创建一个类似于#registered的内部属性并使用它来确保循环只运行一次来解决这个问题。

import { Readable } from 'stream';

export class YourStream extends Readable {
    #registered = false;

    constructor() {
        super();
    }

    _read(): void {
        if (this.#registered) return;
        this.#registered = true;

        // do your stuff here
    }
}

相关问题