SubscribableOrPromise
SubscribableOrPromise
接口描述行为像 Observables 或者 Promises 的值。每个操作符
接受被这个接口 annotate 过的参数,也可以使用不是 RxJS Observables 的参数。
下列类型的值可以传递给期望此接口的操作符:
Observable
RxJS Observable 实例。
类 Observable 对象 (Subscribable)
这可以是任何拥有 Symbol.observable
方法的对象。当这个方法被调用的时候,应该返回一个带有
subscribe
方法的对象,这个方法的行为应该和 RxJS 的 Observable.subscribe
一致。
Symbol.observable
是 https://github.com/tc39/proposal-observable 提案的一部分。
当实现一个自定义的类 Observable 对象,因为现在还没有被原生支持, 每个符号只和自己相等,你应该使用 https://github.com/blesh/symbol-observable 垫片。
TypeScript Subscribable 接口问题
尽管 TypeScript 接口声明,可订阅对象是一个声明了 subscribe
方法的对象,但是传递定义了 subscribe
方法
但是没有定义 Symbol.observable
方法的对象在运行时会失败。相反地,传递定义了 Symbol.observable
而没有
定义 subscribe
的对象将会在编译时失败(如果你使用 TypeScript)。
TypeScript 在支持定义了 symbol 属性方法的接口时是有问题的。为了绕过它,你应该直接实现
subscribe
方法,并且使 Symbol.observable
方法简单地返回 this
。这种方式能够
起作用,编译器也不会报错。如果你真的不想添加 subscribe
方法,你可以在将其传递给操作符之前,
将类型转化为 any
。
当这个 issue 被解决了,可订阅的接口仅允许定义了 Symbol.observable
方法的类 Observable
对象,无论该对象是否实现了 subscribe
方法。
ES6 Promise
Promise 可以被认为是 Observable,当 resolved 的时候,Observable 发出值并完成, 当 rejected 的时候,Observable 发出错误。
类 Promise 对象 (可使用 then 方法的)
传递给操作符的 Promises 不需要是 ES6 原生的 Promises。可以直接使用流行库或垫片中的实现,甚至自己来实现。
它只需要拥有 then
方法,并且该方法和 ES6 Promise 的 then
行为
一致。
Example:
const nonRxJSObservable = {
subscribe(observer) {
observer.next(1000);
observer.complete();
},
[Symbol.observable]() {
return this;
}
};
Rx.Observable.merge(nonRxJSObservable)
.map(value => "This value is " + value)
.subscribe(result => console.log(result)); // 输出 "This value is 1000"
Rx.Observable.combineLatest(Promise.resolve(5), Promise.resolve(10), Promise.resolve(15))
.subscribe(
value => console.log(value),
err => {},
() => console.log('the end!')
);
// 输出:
// [5, 10, 15]
// "the end!"