2016-12-22 7 views
1

私はRx.Observable.prototype.reduceArray.prototype.reduceようなので、私はこのようにスキャンを使用することはできませんなぜ私が疑問に思うreduceが手書きチェーンメソッドと異なる動作をするのはなぜですか?

 function fn(prev, num){ 
      return Rx.Observable.of(prev+num); 
     } 

     fn(1, 1).switchMap(res =>fn(res, 2)) 
       .switchMap(res =>fn(res, 3)) 
       .subscribe(x=>console.log(x)); 

     // 7 



     Rx.Observable.from([2,3]).reduce(
      (prev, cur) =>prev.switchMap(res => fn(res, cur)), 
      fn(1, 1) 
     ).subscribe(x=>console.log(x)) 

     // SwitchObservable {source: FlatMapObservable} 

そのようなコードを記述していると思いますか?どのように私は正しい方法でオペレータを使用できますか?

答えて

1

あなたのアキュムレータがObservableであるからです。

Rx.Observable.from([2,3]).reduce(
    (prev, cur) =>prev.switchMap(res => fn(res, cur)), 
    fn(1, 1) 
).switchMap(x => x).subscribe(x=>console.log(x)) 
を編集した後

Rx.Observable.from([2,3]).scan(
    (prev, cur) =>prev.switchMap(res => fn(res, cur)), 
    fn(1, 1) 
).last().switchMap(x => x).subscribe(x=>console.log(x)) 

:あなたはより多くの時間switchMap 1を呼び出すことによって、あなたの価値を得ることができます

関連する問題