Câu trả lời:
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.of
là cách các đối số được truyền.
Tuy nhiên, Observable.from
sẽ 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.
Điều quan trọng cần lưu ý là sự khác biệt giữa of
và from
khi 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ự.
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.
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'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
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