2017-03-09 178 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