我在处理一些输入、启动 Ajax 请求并处理该请求的结果的简单 RxJS 流方面遇到问题。
重现问题的简单示例:
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)
所以我希望该函数 fakeRequest
对于 RxJS Observable 中的每个值只调用一次。但是,当我添加多个订阅者时,每个订阅者都会启动请求。
是否有另一种方法可以替代 flatMapLatest
,以便为每个 Observable 值仅启动一个请求?
最佳答案
您可以尝试使用.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>
关于rxjs - 每个可观察值仅调用一次 RxJS 平面 map 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40019249/