当我在由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也有同样的问题。
答案 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
}
。