1 Thực hiện / Chuyển đổi trực tiếp
Sử dụng from
để trực tiếp chuyển đổi một lời hứa được tạo trước đó thành một lời quan sát.
import { from } from 'rxjs';
// getPromise() will only be called once
const observable$ = from(getPromise());
observable$
sẽ là một quan sát nóng mà có hiệu quả thay thế giá trị hứa hẹn cho các thuê bao.
Phần thân lời hứa đang được thực thi hoặc đã được giải quyết khi có thể quan sát được. Nếu lời hứa bên trong đã được giải quyết, một thuê bao mới có thể quan sát được sẽ nhận được giá trị của nó ngay lập tức.
2 thực thi bị hoãn trên mỗi lượt đăng ký
Sử dụng defer
với chức năng nhà máy lời hứa làm đầu vào để trì hoãn việc tạo và chuyển đổi lời hứa thành có thể quan sát được.
import { defer } from 'rxjs';
// getPromise() will be called every time someone subscribes to the observable$
const observable$ = defer(() => getPromise());
observable$
sẽ là một quan sát lạnh .
Sự khác biệt from
là defer
chờ đợi một thuê bao và chỉ sau đó tạo ra một lời hứa mới bằng cách gọi chức năng nhà máy lời hứa đã cho. Điều này hữu ích khi bạn muốn tạo một quan sát nhưng không muốn lời hứa bên trong được thực thi ngay lập tức. Lời hứa bên trong sẽ chỉ được thực hiện khi ai đó đăng ký có thể quan sát được. Mỗi thuê bao cũng sẽ có được quan sát mới của riêng mình.
3 Nhiều nhà khai thác chấp nhận lời hứa trực tiếp
Hầu hết các nhà khai thác RxJS kết hợp (ví dụ merge
, concat
, forkJoin
, combineLatest
...) hoặc chuyển đổi quan sát (ví dụ switchMap
, mergeMap
, concatMap
, catchError
...) chấp nhận lời hứa trực tiếp. Nếu bạn vẫn đang sử dụng một trong số họ thì trước tiên bạn không phải sử dụng from
để thực hiện lời hứa (nhưng để tạo ra một thứ lạnh có thể quan sát được, bạn vẫn có thể phải sử dụng defer
).
// Execute two promises simultaneously
forkJoin(getPromise(1), getPromise(2)).pipe(
switchMap(([v1, v2]) => v1.getPromise(v2)) // map to nested Promise
)
Kiểm tra tài liệu hoặc triển khai để xem nhà điều hành bạn đang sử dụng chấp nhận ObservableInput
hay SubscribableOrPromise
.
type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
// Note the PromiseLike ----------------------------------------------------v
type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
Sự khác biệt giữa from
và defer
trong một ví dụ: https://stackblitz.com/edit/rxjs-6rb7vf
const getPromise = val => new Promise(resolve => {
console.log('Promise created for', val);
setTimeout(() => resolve(`Promise Resolved: ${val}`), 5000);
});
// the execution of getPromise('FROM') starts here, when you create the promise inside from
const fromPromise$ = from(getPromise('FROM'));
const deferPromise$ = defer(() => getPromise('DEFER'));
fromPromise$.subscribe(console.log);
// the execution of getPromise('DEFER') starts here, when you subscribe to deferPromise$
deferPromise$.subscribe(console.log);
from
phương thức trả về có thể quan sát được nhưng nó đang gửi lời hứa dưới dạng giá trị cho các đăng ký. :(