rxjs - 每个可观察值仅调用一次 RxJS 平面 map 函数

标签 rxjs

我在处理一些输入、启动 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/

相关文章:

Angular - 为什么我的弹珠测试不适用于包含用户权限的BehaviorSubject?

javascript - http.get 未在 Angular 8 中执行

angular - RxJs - Jasmine 弹珠 forkJoin 操作符测试

javascript - ReactiveX 中数组实体和子项的调用方法

angular - 如何在 Angular RxJS 中响应式订阅 URL 更改并获取 URL?

javascript - 如何通过 RxJs 合并或 groupBy toPromise?

javascript - Angular 'values is undefined' 订阅映射的 http 响应(未发出请求?)

node.js - NestJS 返回 HTTP 请求的结果

angular - ngOnDestroy 中的 RxJS "unsubsribe"方法处理资源的速度不够快

javascript - Angular 6 解析始终未定义