使用 reduce Subject 而不调用 complete

Use reduce Subject without calling complete

我是 RxJS 的新手。我正在使用 RxJs 5.5.2

为简单起见,我想在每次调用 next 主题时 return 减少值。这是一个示例代码:

const sub = new Subject<number>();
const obsesvable = sub.pipe(
  reduce((a, b) => {
    return a + b;
  }, 0)
);

obsesvable.subscribe(x => console.log(x));

sub.next(2);
sub.next(3);
// if I don't call this nothing happens
sub.complete();

现在,如果我不调用 sub.complete(),什么也不会发生。

如果我调用 sub.complete(),我将无法再使用 sub.next() 发送值;

看看 reduce 方法的 marble diagram

它只会在流结束时发出,这就是为什么在调用 complete 之前你没有任何东西的原因。

如果您想 "reduce" 并随时间获取值,您应该使用 scan

所以你的代码应该是:

const sub = new Subject<number>();
const obsesvable = sub.pipe(
  scan((a, b) => {
    return a + b;
  }, 0)
);

obsesvable.subscribe(x => console.log(x));

sub.next(2);
// output: 2
sub.next(3);
// output: 5