Toán tử 'của' vs 'từ'


153

Là sự khác biệt duy nhất giữa Observable.ofObservable.fromđịnh dạng đối số? Thích Function.prototype.callFunction.prototype.apply?

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

Câu trả lời:


115

Không hẳn. Khi truyền một mảng tới Observable.from, sự khác biệt duy nhất giữa nó và Observable.oflà cách các đối số được truyền.

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

một đối tượng có thể đăng ký, một Promise, giống như có thể quan sát được, một mảng, một đối tượng có thể lặp lại hoặc giống như một mảng sẽ được chuyển đổi

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


193

Điều quan trọng cần lưu ý là sự khác biệt giữa offromkhi truyền một cấu trúc giống như mảng (bao gồm cả chuỗi):

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 phần tử 1 bằng 1.

Đối với chuỗi hành vi là như nhau, nhưng ở cấp độ ký tự.


Điều gì xảy ra nếu Observable.of (1, 2, 3) .subscribe (x => console.log (x));
xiaoke

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

16

Một sự thật thú vị khác là Observable.of ([]) sẽ là một mảng trống khi bạn đăng ký nó. Khi bạn đăng ký vào 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 một thao tác liên tiếp với sơ đồ chuyển mạch.

Ví dụ: Trong ví dụ dưới đây, tôi đang lưu một công việc và sau đó các trang web, sau đó nhận xét dưới dạng luồng.

.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 không có trang web để lưu, tức là; data.length = 0 trong phần addSite, đoạn mã trên đang trả về Observable.of ([]) và sau đó đi để 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


6

Sự khác biệt một dòng:

       let fruits = ['orange','apple','banana']

từ : Phát ra từng mục một của mảng. Ví dụ

    from(fruits).subscribe(console.log) // 'orange','apple','banana'

of : Phát ra toàn bộ mảng cùng một lúc. Ví dụ

 of(fruits).subscribe(console.log) //  ['orange','apple','banana']

LƯU Ý: của toán tử có thể hành xử như từ toán tử với toán tử trải

 of(...fruits).subscribe(console.log) //  'orange','apple','banana'


0

from: Tạo có thể quan sát từ mảng, lời hứa hoặc lặp lại. Chỉ có một giá trị. Đối với mảng, iterables và chuỗi, tất cả các giá trị được chứa sẽ được phát ra dưới dạng một chuỗi

const values = [1, 2, 3];
from(values); // 1 ... 2 ... 3

of: Tạo có thể quan sát với số lượng giá trị thay đổi, phát ra các giá trị theo thứ tự, nhưng mảng là giá trị đơn

const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.