RxJava - 与switchMap()运算符相反?

时间:2016-05-11 19:18:20

标签: rx-java reactive-programming

我想知道是否有办法组合现有的运算符来执行switchMap()的反向运算。

switchMap()将追踪它收到的最新发射并取消之前执行的任何Observable。让我们说它翻了一下,我想忽略所有排放到xxxMap()运营商的排放,因为它忙于收到它的第一次发射。它将继续忽略排放,直到它完成在其内部发射当前Observable。然后它将处理它接收的下一个发射。

Observable.interval(1, TimeUnit.SECONDS)
        .doOnNext(i -> System.out.println("Source Emitted Value: " + i))
        .ignoreWhileBusyMap(i -> doIntensiveProcess(i).subcribeOn(Schedulers.computation())) 
        .subscribe(i -> System.out.println("Subscriber received Value: " + i));

有没有办法实现这个目标?在上面的示例中,如果intensiveProcess()持续三秒钟,ignoreWhileBusyMap()将处理0,但可能会忽略来自{{1}的排放12然后它会处理interval(),但可能会忽略34,依此类推......

3 个答案:

答案 0 :(得分:6)

当然,通过处理完成后设置的布尔值来处理值:

AtomicBoolean gate = new AtomicBoolean(true);

Observable.interval(200, TimeUnit.MILLISECONDS)
.flatMap(v -> {
    if (gate.get()) {
        gate.set(false);

        return Observable.just(v).delay(500, TimeUnit.MILLISECONDS)
                .doAfterTerminate(() -> gate.set(true));
    } else {
        return Observable.empty();
    }
})
.take(10)
.toBlocking()
.subscribe(System.out::println, Throwable::printStackTrace);

修改

替代:

Observable.interval(200, TimeUnit.MILLISECONDS)
.onBackpressureDrop()
.flatMap(v -> {
    return Observable.just(v).delay(500, TimeUnit.MILLISECONDS);
}, 1)
.take(10)
.toBlocking()
.subscribe(System.out::println, Throwable::printStackTrace);

您可以将onBackpressureDrop更改为onBackpressureLatest,以便立即继续使用最新值。

答案 1 :(得分:1)

我知道这是一个旧线程,但是目前有一个RxJs运算符可以做到这一点。

运算符为 "error": "invalid_grant", "error_description": "Bad credentials" }``` I am using PostMan to use the api. I have provided a username and a password as the Basic Auth. I don't know what is missing. Any help would be greatly appreciated. Thanks.

根据docs

  

ExhaustMap将每个源值投影到一个Observable,只有在先前的投影Observable完成时,该值才合并到Observable输出中。

文档example

exhaustMap

答案 2 :(得分:0)

回答Jeopardy风格:什么是concatMap

concatMap将订阅第一个Observable,并且在之前的Observable来电Observable之前不会订阅后续的onComplete()

在这方面,它是switchMap的“对立面”,当新的Observable出现时,它急切地取消订阅concatMap

switchMap希望听到每个Observable都要说的一切,而<!DOCTYPE html> <head> <style> .page-loader{ position:fixed; top:0;left:0; width:100%; height:100%; background:#000; color:#fff; } .page-loader p{ position:relative; top: 50%; -webkit-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); text-align:center; } </style> </head> <body> <div class="page-loader"> <p>INTRO TEXT<br>(Will dissapear in 5 seconds)</p> </div> Rest Of Your Page <!-- JavaScripts Place At Bottom Of Page Before The </body> tag--> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> <script> $(document).ready(function(){ $('.page-loader').delay(5000).fadeOut('slow', function() { $('.page-loader').remove(); }); }); </script> </body> </html> 是一个社交蝴蝶,并在另一个Observable可用时立即继续。