Typescript 还原和扫描与对象的组合

Typescript 还原和扫描与对象的组合,typescript,rxjs,rxjs5,Typescript,Rxjs,Rxjs5,RxJS版本:5.5.2 我有一个数组const v=[1,2,3] 我希望能够从这个数组中创建一个主题,并表现得像一个可观察的对象,直到它消耗了1,2,3个值。在那之后,我想表现得像一个主体 这就是我遇到麻烦的地方。我需要对初始值v=[1,2,3]使用reduce,然后每次受试者添加另一个值以使用scan 代码如下: const v = [1, 2, 3]; const sub = new Subject<number>(); const observable = sub.pipe

RxJS版本:5.5.2

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

我希望能够从这个数组中创建一个主题,并表现得像一个可观察的对象,直到它消耗了1,2,3个值。在那之后,我想表现得像一个主体

这就是我遇到麻烦的地方。我需要对初始值
v=[1,2,3]
使用
reduce
,然后每次受试者添加另一个值以使用
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));
我想要打印的只是最后一个值
6
。用
reduce
替换
scan
,只有在主题完成时才可以完成任务(这样我以后就不能再发送任何值了)


然后每次受试者发送一个值
sub.next(4)
打印
10
,依此类推。

您可以使用
skipWhile()
跳过
扫描
中不需要的前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);
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