【问题标题】:How to use exhaustMap in ReactiveX/rxjs 5 in TypeScript如何在 TypeScript 的 ReactiveX/rxjs 5 中使用排气映射
【发布时间】:2016-08-11 08:16:56
【问题描述】:

我想知道如何处理一个数组,其中每个值都按照指定的顺序返回一个 Promise。例如,假设我要按此顺序调用多个 Ajax 调用:

var array = [
    'http://example.org',
    'http://otherexample.org',
    'http://anotherexample.org',
];

基本上有同样的问题:How can I use RxJs to hold off any requests for an AJAX call until the previous one resolves,建议使用flatMapFirst

由于我在使用 rxjs@5.0.0-beta.2 的 TypeScript 中使用 Angular2(此时为 beta-15),我发现 flatMapFirst has been renamed to exhaustMap

但是Observable.ts 中没有列出这个运算符,所以我不能使用它。它甚至没有出现在 RxJS https://code.angularjs.org/2.0.0-beta.15/Rx.js 的捆绑版本中。

那么,我应该如何使用它?或者还有其他方法可以满足我的需要吗?它的package.json 列出了很多构建脚本,我应该强制它使用其中一个吗?

编辑:我应该提到我正在使用ReactiveX/rxjs 库,而不是Reactive-Extensions/RxJS

【问题讨论】:

  • 根据您的问题描述,您实际上可能希望使用concatMap。听起来您想处理所有请求而不丢弃任何请求。
  • 你是对的 concatMap 做了我需要的。

标签: typescript angular reactive-programming rxjs


【解决方案1】:

Operator concatMap() 完成了这项工作:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/concatMap';

var urls = [
  'https://httpbin.org/get?1',
  'https://httpbin.org/get?2',
  'https://httpbin.org/get?3',
  'https://httpbin.org/get?4',
  'https://httpbin.org/get?5',
];     

Observable.from(this.urls)
  .concatMap(url => http.get(url))
  .subscribe(response => console.log(response.url))
;

这会打印到控制台:

https://httpbin.org/get?1
https://httpbin.org/get?2
https://httpbin.org/get?3
https://httpbin.org/get?4
https://httpbin.org/get?5

【讨论】:

  • 我认为“concat”会做同样的工作,不是吗?
  • 并非如此,concat 要求您事先创建 Observable。使用concatMap,我可以为每个值创建新的 Observable,因为它们被发出。
  • @martin,“预先创建可观察对象”是什么意思?你能提供任何代码示例吗
猜你喜欢
  • 2016-08-25
  • 2021-11-09
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多