RxJava与用户创建的Flowable合并只发出最后一个Flowable

时间:2018-01-08 11:01:45

标签: java rx-java rx-java2

当我在由Flowable.create()创建的两个Flowable(a1,a2)上使用Flowable.merge()时,它只会发出a2。但是当我合并由Flowable.interval()创建的两个Flowable(b1,b2)时,它将按照我的预期发出b1和b2。所以我的问题是为什么这两个方法(创建和间隔)导致两个不同的结果流?

以下是我的问题的简单演示:

public class MergeProblem {

    private static FlowableEmitter<Integer> emitter;

    public static void main(String[] args) throws Exception {

        Flowable<Integer> a = Flowable.create(emitter -> 
            MergeProblem.emitter = emitter, BackpressureStrategy.BUFFER);

        Flowable<String> a1 = a.map(x -> "a1 " + x);
        Flowable<String> a2 = a.map(x -> "a2 " + x);

        Flowable<Long> b = Flowable.interval(1, TimeUnit.SECONDS);
        Flowable<String> b1 = b.map(x -> "b1 " + x);
        Flowable<String> b2 = b.map(x -> "b2 " + x);

//        Flowable<String> c1 = Flowable.interval(1, TimeUnit.SECONDS)
//            .map(x -> "c1 " + x);
//        Flowable<String> c2 = Flowable.interval(1, TimeUnit.SECONDS)
//            .map(x -> "c2 " + x);

        Flowable.merge(Arrays.asList(a1, a2, b1, b2/*, c1, c2*/))
           .subscribe(System.out::println);

        AtomicInteger counter = new AtomicInteger(0);
        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                emitter.onNext(counter.getAndIncrement());
            }
        }, 0, 1000);

        Thread.sleep(10000);
    }
}

所以输出将是这样的:

a2 0
a2 1
b1 0
b2 0
b2 1
a2 2
...

Observable也有同样的问题。

1 个答案:

答案 0 :(得分:3)

区别在于:

emitter -> MergeProblem.emitter = emitter

通常没有理由从create隐藏发射器,但是你做了,并且给了两个不同的subscribe()调用,最新的一个将覆盖MergeProblem.emitter,因此你只有最后一个订阅者与...交谈。

看起来你应该使用PublishProcessor而不是onNext来发送Subscriber// Customizing default checkout shipping fields add_filter( 'woocommerce_shipping_fields', 'customizing_shipping_fields' ); function customizing_shipping_fields($fields){ # 1. Remove shipping fields unset($fields['shipping_country']); unset($fields['shipping_state']); # 2. Customize shipping fields $label_fields = array( 'first_name' => __('取件者 *'), 'last_name' => __('手機號碼 *'), 'company' => __('店名 *'), 'city' => __('服務編號 *'), 'address_1' => __('收件地址 *'), 'address_2' => __('預計來訪時間 *'), ); foreach( $label_fields as $key => $value ){ $fields['shipping_'.$key]['label'] = $value; $fields['shipping_'.$key]['id'] = 'shipping_'.$key; } # 3. Customize shipping fields required $required_fields = array( 'first_name', 'last_name', 'company', 'city', 'address_1', 'address_2', 'postcode'); foreach( $required_fields as $key => $value ) $fields['shipping_'.$key]['required'] = false; return $fields; } // Add a Custom radio field for shipping options add_action( 'woocommerce_before_checkout_shipping_form', 'custom_shipping_radio_button', 10, 1 ); function custom_shipping_radio_button( $checkout ) { # 1. CSS styling ?> <style>label.radio{ display:inline-block; margin-right:1em; }</style> <?php # 2. Add a custom radio field woocommerce_form_field( 'shipping_type', array( 'type' => 'radio', 'class' => array( 'form-row-wide' ), 'label' => __('收件方式'), 'options' => array( 'shipping_1' => __('全家店到店'), 'shipping_2' => __('指定地址'), 'shipping_3' => __('自行取貨'), ), ), $checkout->get_value( 'shipping_type' ) ); # 3. jQuery Script ?> <script type="text/javascript"> jQuery(function($){ $("input[name=shipping_type]").on("change",function(){ if($("#shipping_type_shipping_1").is(":checked")) { $("#shipping_first_name,#shipping_last_name,#shipping_city,#shipping_company").fadeIn(); } else { $("#shipping_first_name,#shipping_last_name,#shipping_city,#shipping_company").fadeOut(); } if($("#shipping_type_shipping_2").is(":checked")) { $("#shipping_postcode,#shipping_address_1").fadeIn(); } else { $("#shipping_postcode,#shipping_address_1").fadeOut(); } if($("#shipping_type_shipping_3").is(":checked")) { $("#shipping_address_2_field_2").fadeIn(); } else { $("#shipping_address_2_field_2").fadeOut(); } }); }); </script> <?php }