我遇到一个简单的RxJS流问题,它处理一些输入,启动Ajax请求并处理该请求的结果。
重现问题的一个简单例子:
var requestCalled = 0;
function fakeRequest(value) {
return new Promise(function(resolve) {
requestCalled++;
document.write("<p>"+requestCalled+" ("+value+")</p>");
});
}
var stream = Rx.Observable.interval(3000)
.debounce(500)
.distinctUntilChanged()
.flatMapLatest(fakeRequest);
stream.subscribe(() => {});
stream.subscribe(() => {});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.min.js"></script>
结果(每个可观察值调用fakeRequest
两次)
1 (0)
2 (0)
3 (1)
4 (1)
预期结果(仅调用fakeRequest
一次)
1 (0)
2 (1)
所以我希望在RxJS Observable中每个值只调用一次函数fakeRequest
。但是当我添加多个订阅者时,每个订阅者都会启动请求。
是否有另一种方法可以替换flatMapLatest
,以便只为每个Observable值启动一个请求?
答案 0 :(得分:1)
您可以尝试使用.share
var requestCalled = 0;
function fakeRequest(value) {
return new Promise(function(resolve) {
requestCalled++;
document.write("<p>"+requestCalled+" ("+value+")</p>");
});
}
var stream = Rx.Observable.interval(3000)
.debounce(500)
.distinctUntilChanged()
.flatMapLatest(fakeRequest)
.share();
stream.subscribe(() => {});
stream.subscribe(() => {});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.min.js"></script>