响应式编程之doOnNext

223 阅读1分钟
public void hystrix(String username){

        /**
         * R call();
         */
        Func0<Observable<Object>> defer = new Func0<Observable<Object>>(){
            @Override
            public Observable<Object> call() {
                System.out.println("4.username = " + username);
                return Observable.just(2);
            }
        };
        /**
         * R call(T t);
         */
        Func1<Object,Object> map = new Func1<Object,Object>(){

            @Override
            public Object call(Object observable) {
                System.out.println("5.username = " + username);
                if(observable instanceof Integer){
                    return ((Integer) observable)* 3;
                }
                return null;
            }
        };

        Observable.defer(new Func0<Observable<Object>>() {
            @Override
            public Observable<Object> call() {
                System.out.println("1.username = " + username);
                return Observable.defer(new Func0<Observable<Object>>() {
                    @Override
                    public Observable<Object> call() {
                        System.out.println("2.username = " + username);
                        Observable rtn = Observable.defer(defer)
                                .map(map);
                          return rtn.doOnNext(new Action1() {
                              @Override
                              public void call(Object o) {
                                  System.out.println("this is doOnNext 1");
                              }
                          });
//                        return rtn.doOnCompleted(new Action0() {
//                            @Override
//                            public void call() {
//                                System.out.println("3.username = " + username);
//                            }
//                        });
                    }
                }).doOnNext(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        System.out.println("this is doOnNext");
                    }
                });
            }
        }).subscribe(new Subscriber<Object>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                System.out.println("this is onNext o = " + o);
            }
        });
    }

1、doOnNext

public final Observable<T> doOnNext(final Action1<? super T> onNext) {
    Action1<Throwable> onError = Actions.empty();
    Action0 onCompleted = Actions.empty();
    Observer<T> observer = new ActionObserver<T>(onNext, onError, onCompleted);
    // this 指的是最近的upstream defer,也即source
    return unsafeCreate(new OnSubscribeDoOnEach<T>(this, observer));
}

2、OnSubscribeDoOnEach

public OnSubscribeDoOnEach(Observable<T> source, Observer<? super T> doOnEachObserver) {
    this.source = source;//source 指的是最近的upstream defer
    this.doOnEachObserver = doOnEachObserver;
}
public void call(final Subscriber<? super T> subscriber) {
    source.unsafeSubscribe(new DoOnEachSubscriber<T>(subscriber, doOnEachObserver));
}

针对其call的调用发现优先执行source的订阅。最终才会执行当前doOnNext的订阅。

3、Observable

public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
    return new Observable<T>(RxJavaHooks.onCreate(f));
}
protected Observable(OnSubscribe<T> f) {
    this.onSubscribe = f;//OnSubscribeDoOnEach
}