缩小和扫描与主题

时间:2017-11-11 01:22:17

标签: typescript rxjs rxjs5

RxJS版本:5.5.2

我有一个数组const v = [1, 2, 3];

我希望能够从这个数组创建一个Subject,并且像Observable一样,直到它消耗1,2,3个值。之后我想表现得像个主题。

这是我遇到麻烦的地方。我需要在初始值reduce上使用v = [1, 2, 3],然后每当主题添加另一个值以使用scan

以下是代码:

const v = [1, 2, 3];
const sub = new Subject<number>();
const observable = sub.pipe(
  startWith(0),
  concatMap(x => from(v)),
  scan((a, b) => { // or reduce
    return a + b;
  }, 0),
);
observable.subscribe(x => console.log(x));

如果我在这里使用scan,则会在控制台上打印

1
3
6

我想要打印的内容只是最后一个值6。将scan替换为reduce只有在主题完成后才能完成工作(这样我以后就无法再发送任何值)。

然后每次主题发送值sub.next(4);以打印10等等。

1 个答案:

答案 0 :(得分:1)

您可以使用skipWhile()跳过scan您不想要的前N个排放:

import { Subject } from "rxjs/Subject";
import { from } from "rxjs/observable/from";
import { of } from "rxjs/observable/of";
import { merge, concatMap, scan, skipWhile, tap } from "rxjs/operators";

const v = [1, 2, 3];
let skipFirst;

const sub = new Subject<number>();

const observable = of(v).pipe(
  tap(arr => skipFirst = arr.length),
  concatMap(arr => from(arr)),
  merge(sub),
  scan((a, b) => { // or reduce
    return a + b;
  }, 0),
  skipWhile(() => --skipFirst > 0),
);
observable.subscribe(x => console.log(x));

sub.next(5);

打印:

6
11