es6/operator/dematerialize.js
import { Subscriber } from '../Subscriber';
/**
* 将 {@link Notification} 对象的 Observable 转换成它们所代表的发送。
*
* <span class="informal">将 {@link Notification} 对象拆开成实际的 `next`、
* `error` 和 `complete` 发送。它与 {@link materialize} 是相反的。</span>
*
* <img src="./img/dematerialize.png" width="100%">
*
* `dematerialize` 被假定用来操作只发送值为 {@link Notification} 对象的 `next`,
* 不发送 `error` 的 Observable 。这样的 Obseravble 其实是 `materialize`
* 操作符的输出。然后这些通知会使用它们所包含的元数据进行拆解,并在输出 Observable 上
* 发出 `next` 、`error` 和 `complete` 。
*
* 与 {@link materialize} 结合来使用此操作符。
*
* @example <caption>将 Notification 类型的 Observable 转换成实际的 Observable</caption>
* var notifA = new Rx.Notification('N', 'A');
* var notifB = new Rx.Notification('N', 'B');
* var notifE = new Rx.Notification('E', void 0,
* new TypeError('x.toUpperCase is not a function')
* );
* var materialized = Rx.Observable.of(notifA, notifB, notifE);
* var upperCase = materialized.dematerialize();
* upperCase.subscribe(x => console.log(x), e => console.error(e));
*
* // 结果:
* // A
* // B
* // TypeError: x.toUpperCase is not a function
*
* @see {@link Notification}
* @see {@link materialize}
*
* @return {Observable} 该 Observable 会发出数据项和通知,它们是由源 Observable 所发出
* 并且包装在 Notification 对象之中的。
* @method dematerialize
* @owner Observable
*/
export function dematerialize() {
return this.lift(new DeMaterializeOperator());
}
class DeMaterializeOperator {
call(subscriber, source) {
return source.subscribe(new DeMaterializeSubscriber(subscriber));
}
}
/**
* We need this JSDoc comment for affecting ESDoc.
* @ignore
* @extends {Ignored}
*/
class DeMaterializeSubscriber extends Subscriber {
constructor(destination) {
super(destination);
}
_next(value) {
value.observe(this.destination);
}
}
//# sourceMappingURL=dematerialize.js.map