如何让Subject正常运行rxjs?

时间:2019-05-24 21:23:29

标签: javascript rxjs

我拥有永不停止的数据流。需要对数据流的各个项目运行一种算法。该算法无法跟上数据流的速度,因此需要丢弃在处理算法时到达的数据项。我试图使用rxjs的{​​{1}}运算符来完成此操作,但是当我从throttle发出要用作durationSelector的内容时,节流阀不会重置。但是,当我用Subject运算符替换Subject时,节流阀确实起作用。我猜我缺少一些简单的东西,但是我没有看到它。

interval

此处可运行的代码:https://stackblitz.com/edit/rxjs-tbs8qz

上面有一个数据流,每200ms产生一次数据。该算法需要1000毫秒,因此应打印import { Subject, interval, range } from 'rxjs'; import { throttle } from 'rxjs/operators'; function algorithm() { // simulate algorithm taking 1000ms return new Promise(resolve => setTimeout(resolve, 1000)); } const dataStream = interval(200); const algorithmDone = new Subject(); const pipeline = dataStream.pipe(throttle(sv => algorithmDone)); pipeline.subscribe(x => { console.log('here ' + x); algorithm(); algorithmDone.next(0); }); 中大约每五分之一的内容。通过上述实现,我只会得到第一个数字。如果将dataStream中的algorithmDone替换为throttle(),则会得到预期的输出。为什么我的interval(1000)不起作用?

1 个答案:

答案 0 :(得分:2)

algorithm()函数返回一个诺言,但您正在使用它,就好像它是同步的一样。

更改:

pipeline.subscribe(x => {
  console.log('here ' + x);
  algorithm();
  algorithmDone.next(0);
});

要:

pipeline.subscribe(x => {
  console.log('here ' + x);
  algorithm().then(() => algorithmDone.next(0));
});

或:

pipeline.subscribe(async x => {
  console.log('here ' + x);
  await algorithm();
  algorithmDone.next(0);
});