es6/operator/do.js
import { Subscriber } from '../Subscriber';
/* tslint:enable:max-line-length */
/**
* 为源 Observable 上的每次发送执行副作用,但返回的 Observable 与源 Observable 是相同的。
*
* <span class="informal">拦截源 Observable 上的每次发送并且运行一个函数,但返回的输出 Observable 与
* 源 Observable 是相同的,只要不发生错误即可。</span>
*
* <img src="./img/do.png" width="100%">
*
* 返回源 Observable 的镜像,但镜像是修改过的,以便调用提供的 Observer 来为源 Observable
* 发出的每个值,错误和完成执行副作用。在上述的 Observer 或处理方法中抛出的任何错误都可以
* 安全地发送到输出 Observable 的错误路径中。
*
* 此操作符适用于调试 Observables 以查看值是否正确,或者执行一些其他的副作用操作。
*
* 注意:此操作符不同于 Observable 的 `subscribe`。如果 `do` 返回的 Observable 没有被订阅,
* 那么观察者指定的副作用永远不会执行。因此 `do` 只是侦查已存在的执行,它不会像 `subscribe`
* 那样触发执行的发生。
*
* @example <caption>把每次点击映射成该点击的 clientX ,同时还输出点击事件</caption>
* var clicks = Rx.Observable.fromEvent(document, 'click');
* var positions = clicks
* .do(ev => console.log(ev))
* .map(ev => ev.clientX);
* positions.subscribe(x => console.log(x));
*
* @see {@link map}
* @see {@link subscribe}
*
* @param {Observer|function} [nextOrObserver] 普通的观察者对象或者 `next` 回调函数。
* @param {function} [error] 源 Observable 的 `error` 回调函数。
* @param {function} [complete] 源 Observable 的 `complete` 回调函数。
* @return {Observable} 与源相同的 Observable,但会为每一项的运行指定观察者或回调函数。
* @method do
* @name do
* @owner Observable
*/
export function _do(nextOrObserver, error, complete) {
return this.lift(new DoOperator(nextOrObserver, error, complete));
}
class DoOperator {
constructor(nextOrObserver, error, complete) {
this.nextOrObserver = nextOrObserver;
this.error = error;
this.complete = complete;
}
call(subscriber, source) {
return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
}
}
/**
* We need this JSDoc comment for affecting ESDoc.
* @ignore
* @extends {Ignored}
*/
class DoSubscriber extends Subscriber {
constructor(destination, nextOrObserver, error, complete) {
super(destination);
const safeSubscriber = new Subscriber(nextOrObserver, error, complete);
safeSubscriber.syncErrorThrowable = true;
this.add(safeSubscriber);
this.safeSubscriber = safeSubscriber;
}
_next(value) {
const { safeSubscriber } = this;
safeSubscriber.next(value);
if (safeSubscriber.syncErrorThrown) {
this.destination.error(safeSubscriber.syncErrorValue);
}
else {
this.destination.next(value);
}
}
_error(err) {
const { safeSubscriber } = this;
safeSubscriber.error(err);
if (safeSubscriber.syncErrorThrown) {
this.destination.error(safeSubscriber.syncErrorValue);
}
else {
this.destination.error(err);
}
}
_complete() {
const { safeSubscriber } = this;
safeSubscriber.complete();
if (safeSubscriber.syncErrorThrown) {
this.destination.error(safeSubscriber.syncErrorValue);
}
else {
this.destination.complete();
}
}
}
//# sourceMappingURL=do.js.map