2017-03-09 181 views
43

Observable.ofObservable.from參數格式之間的唯一區別?像Function.prototype.callFunction.prototype.applyRxJs可觀察vs

Observable.of(1,2,3).subscribe(() => {}) 
Observable.from([1,2,3]).subscribe(() => {}) 

回答

32

它要注意offrom之間的差別是很重要的傳遞數組狀結構時(包括字符串):

Observable.of([1, 2, 3]).subscribe(x => console.log(x)); 

將一次打印整個陣列。

在另一方面,

Observable.from([1, 2, 3]).subscribe(x => console.log(x)); 

由1

打印元件1對於字符串的行爲是相同的,但在字符級。

+0

如果 Observable.of(1,2,3).subscribe(X =>的console.log(X)); – xiaoke

+0

@xiaoke那麼肯定是3個單獨的排放(1,然後2,然後3)。 –

34

不完全。將數組傳遞給Observable.from時,它與Observable.of之間的唯一區別就是傳遞參數的方式。

然而,Observable.from將接受argument

一個訂閱的對象,一個無極,一般可觀察,陣列,可迭代或類似陣列的對象轉換

Observable.of沒有類似的行爲 - 它總是隻接受值並且不執行任何轉換。

1

另一個有趣的事實是當您訂閱它時,Observable.of([])將是一個空數組。 當你訂閱Observable.from([])時,你不會得到任何價值。

這對使用switchmap進行連續保存時很重要。 例:

.do((data) => { 
      this.jobService.save$.next(this.job.id); 
     }) 
     .switchMap(() => this.jobService.addSites(this.job.id, this.sites) 
      .flatMap((data) => { 
       if (data.length > 0) { 
        // get observables for saving 
        return Observable.forkJoin(jobSiteObservables); 
       } else { 
        **return Observable.of([]);** 
       } 
      })).do((result) => { 
      // .. 
     }) 
     .switchMap(() => this.saveComments()) 
.... 

如果addSite部data.length = 0,上面的代碼返回Observable.of([])中,然後轉移到保存註釋。但是如果你用Observable.from([])替換它,後面的方法將不會被調用。

rxfiddle