等待多个观察员的完成

时间:2019-03-29 13:37:14

标签: angular api asynchronous rxjs observable

我正在处理一个Angular7项目,该项目显示来自旧的缓慢后端的多个端点的信息。

  • 我想处理和显示每个端点到达时的信息。这样,用户不必等待最慢的端点,并且处理负载保持分散。

  • 最慢的端点最终返回时,应集中处理合并的集合。

  • 不能保证到达的顺序。

虚构示例:

-我有这两个数据源“矩形”和“正方形”。

-计算每个项目的面积是一项繁重的工作。

-数据完整到达,而不是逐项到达。

-我想在最后一个集合到达时对整个集合进行排序。

    Rectangles: [ {x:1 , y:3} , {x:3,y:2}   ] 30 seconds to get this
    Squares   : [ { side:10 } , { side: 2} ]  2 minutes to get this

Desired output:
    Displayed at 30 seconds: Rect-Area-3 , Rect-Area-6

    Displayed at 2 minutes: Rect-Area-3 , Square-Area-4 , Rect-Area-6 , Square-Area-100

当前代码

现在,我对每个数据源都有这样的代码。每个来源的数据都有一个完全不同的json结构,它们几乎没有共同点。

public getDemographicData(){
        const myObserver = {
            next: serverData => {
                //
                //Process result , save.
                //Let another component handle data presentation when 
                //change detection occurs
            },
            error: err => console.error('Observer got an error: ' + JSON.stringify(err)),
            complete: () => {}
        };

        // getDemographicsData returns an observable using http.get
        this.dataService.getDemographicsData(surveyId).subscribe(myObserver);
    }

我不认为forkjoin是我想要的,因为一个可以从多个可观察对象中获得一个可观察对象。我不想等待所有数据输入后再处理它。

任何帮助或评论都值得赞赏,我在其他地方找不到满意或可以理解的答案。我只是在不得已的情况下在帮助网站上发帖。

1 个答案:

答案 0 :(得分:2)

您确实想要forkJoin。

在每个流的VirtualMachine中处理各个流的数据,并在forkJoin中触发组合计算,然后同时订阅两者。

tap
let fastObs = of('Fast').pipe(delay(1000), tap(console.log)); // One of the faster http requests, console.log will trigger after 1 second
let slowObs = of('Slow').pipe(delay(10000), tap(console.log)); // Slower, triggers after 10 seconds

https://stackblitz.com/edit/typescript-qrephm?file=index.ts