我想知道是否有办法组合现有的运算符来执行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}的排放1
和2
然后它会处理interval()
,但可能会忽略3
和4
,依此类推......
答案 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可用时立即继续。