2017-11-11 197 views
1

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)); 

如果我使用scan這兒,這是印在控制檯

1 
3 
6 

我想要打印的只是最後一個值6。只有在主題完成後才能替代scanreduce(這樣我以後不能再發送任何值)。

然後每當主題發送一個值sub.next(4);來打印10等等。

回答

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