@Test
public void test() {
Mono.just("a")
.map(s->"map-" + s)
.subscribe(System.out::println);
}
public final void subscribe(Subscriber<? super T> actual) {
CorePublisher publisher = Operators.onLastAssembly(this);
CoreSubscriber subscriber = Operators.toCoreSubscriber(actual);
try {
if (publisher instanceof OptimizableOperator) {
OptimizableOperator operator = (OptimizableOperator) publisher;
while (true) {
subscriber = operator.subscribeOrReturn(subscriber);
if (subscriber == null) {
return;
}
OptimizableOperator newSource = operator.nextOptimizableSource();
if (newSource == null) {
publisher = operator.source();
break;
}
operator = newSource;
}
}
publisher.subscribe(subscriber);
}
catch (Throwable e) {
Operators.reportThrowInSubscribe(subscriber, e);
return;
}
}
MonoJust.subscribe(subscriber)
==> actual.onSubscribe(Operators.scalarSubscription(actual, value)); # 1 启动 onSubscribe
MapFuseableSubscriber.onSubscribe
==> actual.onSubscribe(this);
==> LambdaMonoSubscriber.onSubscribe
==> s.request(Long.MAX_VALUE); # 启动 request
==> MapFuseableSubscriber.request
==> s.request(n);
==> Operators.scalarSubscription(actual, value).request # 启动 next
==> a.onNext(value);
==> MapFuseableSubscriber.onNext(value);
==> mapper.apply(t)
==> actual.onNext(v);
==> LambdaMonoSubscriber.onNext(v)
==> consumer.accept(x);
==> Operators.scalarSubscription(actual, value).request
==> a.onComplete(); # 启动 onComplete
==>MapFuseableSubscriber.onComplete()
==>LambdaMonoSubscriber.onComplete()
总结:
1、onSubscribe从上往下执行,到正真订阅者后启动request
2、request从下往上执行,到数据源后启动onNext
3、onNext从上往下执行,途中经过数据转换
4、onComplete从上往下执行