Observable.on订阅RxJs中的等价物

时间:2017-01-26 21:30:48

标签: rxjs

在RxJava中,Observable.OnSubscribe会在订阅observable时调用您的操作。

RxJs中是否有等价物?

从问这个问题以来,似乎他们已经把页面缩小了。 Google的缓存版本lives here

3 个答案:

答案 0 :(得分:10)

通过组合RxJs5的现有功能,可以轻松实现此功能。



Rx.Observable.prototype.doOnSubscribe = function (onSubscribe) {
  return Rx.Observable.empty()
    .do(null,null, onSubscribe)
    .concat(this);
};

Rx.Observable.from([1,2,3])
  .doOnSubscribe(() => console.log('subscribed to stream'))
  .subscribe(console.log, null, () => console.log('completed'))

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>
&#13;
&#13;
&#13;

当下游订阅doOnSubscribe时,我们首先发出一个空的observable,并使用.do() onComplete回调作为doOnSubscribe。然后我们.concat()上游到此并返回此修改后的流。

答案 1 :(得分:6)

另一个以Mark的答案为基础的例子是使用工厂函数:

Rx.Observable.prototype.doOnSubscribe = function(onSubscribe) {
  const source = this; 
  return Rx.Observable.defer(() => {
      onSubscribe();
      return source;
  });
}

答案 2 :(得分:4)

非常喜欢Mark的回答,但是如果你使用rxjs版本5或更高版本,我宁愿使用纯函数而不是修补原型。

更新

根据Ray的建议使用empty进行concat defer黑客攻击

import {defer} from 'rxjs/observable/defer';
import {Observable} from 'rxjs/Observable';

/** Example
import {from} from 'rxjs/observable/from';

from([1, 2, 3])
    .pipe(doOnSubscribe(() => console.log('subscribed to stream')))
    .subscribe(x => console.log(x), null, () => console.log('completed'));
*/

export function doOnSubscribe<T>(onSubscribe: () => void): (source: Observable<T>) =>  Observable<T> {
    return function inner(source: Observable<T>): Observable<T> {
        return defer(() => {
          onSubscribe();
          return source;
        });
    };
}

https://gist.github.com/evxn/750702f7c8e8d5a32c7b53167fe14d8d

原始答案:

import {empty} from 'rxjs/observable/empty';
import {concat, tap} from 'rxjs/operators';
import {Observable} from 'rxjs/Observable';

/** Example
import {from} from 'rxjs/observable/from';
from([1, 2, 3])
    .pipe(doOnSubscribe(() => console.log('subscribed to stream')))
    .subscribe(x => console.log(x), null, () => console.log('completed'));
*/

export function doOnSubscribe<T>(callback: () => void): (source: Observable<T>) =>  Observable<T> {
    return function inner(source: Observable<T>): Observable<T> {
        return empty().pipe(
            tap(null, null, callback),
            concat<T>(source)
        );
    };