2017-03-09 36 views
43

Sự khác biệt duy nhất giữa định dạng Observable.ofObservable.from định dạng đối số? Giống như Function.prototype.callFunction.prototype.apply?RxJs Có thể quan sát được so với

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

Trả lời

32

Điều quan trọng cần lưu ý sự khác biệt giữa offrom khi đi qua một cấu trúc mảng tương tự (kể cả dây):

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

sẽ in toàn bộ mảng cùng một lúc.

Mặt khác,

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

in các yếu tố 1 bằng 1.

Đối với chuỗi hành vi này là như nhau, nhưng ở cấp độ nhân vật.

+0

gì nếu Observable.of (1, 2, 3) .subscribe (x => console.log (x)); – xiaoke

+0

@xiaoke Sau đó chắc chắn nó là 3 khí thải riêng biệt (1, sau đó 2, sau đó 3). –

34

Không hoàn toàn. Khi chuyển một mảng đến Observable.from, khác biệt duy nhất giữa nó và Observable.of là cách các đối số được truyền đi.

Tuy nhiên, Observable.from sẽ chấp nhận một argument đó là

một đối tượng subscribable, một Promise, một Quan sát giống như, một mảng, một iterable hoặc một đối tượng mảng giống như được chuyển đổi

Không có hành vi tương tự cho Observable.of - luôn chấp nhận các giá trị và không thực hiện chuyển đổi.

1

Một thực tế thú vị khác là Observable.of ([]) sẽ là một mảng trống khi bạn đăng ký với nó. Khi nào bạn đăng ký Observable.from ([]) bạn sẽ không nhận được bất kỳ giá trị nào.

Điều này rất quan trọng khi bạn thực hiện lưu liên tục bằng chuyển đổi. Ex:

.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()) 
.... 

nếu data.length = 0 trong phần addSite, các mã trên đang trở lại Observable.of ([]) và sau đó đi vào lưu ý kiến. Nhưng nếu bạn thay thế nó bằng Observable.from ([]), các phương thức thành công sẽ không được gọi.

rxfiddle

Các vấn đề liên quan