Home Manual Reference Source Test Repository
public interface | source

SubscribableOrPromise

SubscribableOrPromise 接口描述行为像 Observables 或者 Promises 的值。每个操作符 接受被这个接口 annotate 过的参数,也可以使用不是 RxJS Observables 的参数。

下列类型的值可以传递给期望此接口的操作符:

Observable

RxJS Observable 实例。

类 Observable 对象 (Subscribable)

这可以是任何拥有 Symbol.observable 方法的对象。当这个方法被调用的时候,应该返回一个带有 subscribe 方法的对象,这个方法的行为应该和 RxJS 的 Observable.subscribe 一致。

Symbol.observablehttps://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:

用非 RxJS 的 observable 作为参数来使用 merge 和 map 操作符
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"
用 ES6 的 Promise 来使用 combineLatest 操作符
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!"