【问题标题】:Angular 2 & RxJS: map an array using Rx ObservableAngular 2 & RxJS:使用 Rx Observable 映射数组
【发布时间】:2016-11-27 08:47:00
【问题描述】:

我有一个这样的数字数组:[1, 2, 3],并且 HTTP 服务具有按数字加载数据对象的功能,如下所示:

function get(id: number): Observable<object>

如何将我的原始数字数组映射到保留元素顺序的对象数组?

【问题讨论】:

    标签: angular typescript rxjs rxjs5


    【解决方案1】:

    您可以使用concatMap 运算符。

    const Observable = Rx.Observable;
    
    function mockHttpRequest(i) {
      return Observable.of(i).delay(500);
    }
    
    Observable.from([1, 2, 3])
        .concatMap(i => mockHttpRequest(i))
        .subscribe(data => console.log(data));
    

    这会模拟多个 HTTP 请求,其中每个请求延迟 500 毫秒。 Operator concatMap() 保证 Observable 将按顺序调用。

    观看现场演示:https://jsbin.com/subuxo/edit?js,console

    【讨论】:

    • 1) 我希望 Observables 被同时调用,而不是按顺序调用,我希望结果是有序的。 2)我想取回结果数组,而不是单个值
    • @Rem 你需要更好地表述你的问题。您没有提到要并行运行请求的任何地方。顺便说一句,看看forkJoin 运营商。
    【解决方案2】:

    感谢@martin,我找到了这个解决方案:

    const myPromise = val => new Promise(resolve => setTimeout(() => resolve(`Promise Resolved: ${val}`), 
                                                              Math.round(Math.random() * 1000 + 1000)))
    const queue = Rx.Observable.of([1,2,3,4,5]);
    const result = queue
      .mergeMap(q => Rx.Observable.forkJoin(...q.map(myPromise)));
    const subscribeTwo = result.subscribe(val => console.log(val));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2017-10-18
      • 1970-01-01
      • 2017-11-17
      • 2016-07-09
      • 2017-03-16
      相关资源
      最近更新 更多