Rxjs 角度6避免回叫地狱

Rxjs 角度6避免回叫地狱,rxjs,angular6,Rxjs,Angular6,来自AngularJS,我正在努力解决下一个问题。我需要一个返回一个对象的函数(我们称它为a),但在该函数中包含的所有请求都得到解决之前,无法返回该对象。该过程应如下所示: 对象A是从远程服务器下载的 使用A,我们对另一个对象进行操作(B) B从服务器下载 B使用A 使用A和B的结果,我们对第三个对象C C从服务器下载 C使用A和B中的一些属性进行修补 处理B和C后,函数必须返回A 我很想了解如何使用rxjs来做类似的事情,但是对于Angular 6,互联网上的大多数示例似乎都被弃用了,而且

来自AngularJS,我正在努力解决下一个问题。我需要一个返回一个对象的函数(我们称它为a),但在该函数中包含的所有请求都得到解决之前,无法返回该对象。该过程应如下所示:

  • 对象A是从远程服务器下载的
  • 使用A,我们对另一个对象进行操作(B
  • B从服务器下载
  • B使用A
  • 使用AB的结果,我们对第三个对象C
  • C从服务器下载
  • C使用AB中的一些属性进行修补
  • 处理BC后,函数必须返回A

  • 我很想了解如何使用rxjs来做类似的事情,但是对于Angular 6,互联网上的大多数示例似乎都被弃用了,而且教程也没有真正帮助我。我无法修改后端使其更优雅。非常感谢。

    首先,我觉得这个函数可以如前所述,ll会以某种方式阻止调用进程,直到所有指定的事件都发生为止,这在JavaScript中当然是不合理的

    因此,首先,我认为您的函数应该需要一个回调,作为它可能唯一的参数,当所有事情最终发生时将调用该回调

    现在–关于“如何优雅地处理步骤1、2和3”…我马上想到的是有限状态机(FSM)算法的概念

    假设您的函数调用导致一个新的“请求”被放置在某个请求表队列上,并且,如果有必要,一个计时器请求(设置为在1毫秒内关闭)来服务该队列。(此项将包含对回调的引用等内容。)我们还假设该请求被赋予一个随机字符串“nonce”这将用于唯一标识它:这将传递给各种外部请求,并且必须包含在它们相应的答复中

    FSM的想法是请求将有一个状态,(属性),例如:
    DOWNLOADING\u FROM\u B
    B\u DOWNLOADS\u COMPLETE
    DOWNLOADING\u FROM\u C
    C\u REQUESTS\u COMPLETE
    ,等等。这样,在这个完全异步过程中起作用的每个回调都将(1)能够通过其nonce来定位请求条目,然后(2)毫不含糊地定位请求条目“知道下一步要做什么”和“分配什么新状态(如果有)”,完全基于对条目的
    状态的检查

    例如,当状态达到
    C\u REQUESTS\u COMPLETE
    时,应该调用最初提供的回调并删除请求表条目

    您可以轻松地映射出任意复杂场景中可能发生的所有“状态转换”(什么状态可以导致什么状态,以及它们发生时要做什么),不管您是否实际创建了一个数据结构来表示所谓的“状态表”,尽管有时候这样做更优雅(!)。(可能混乱的决策逻辑被简单地推送到一个简单的表查找中。)


    当然,这是一个经典算法,适用于“世界上的每一种编程语言”,并且已经在其中使用过

    首先,在我看来,这个函数调用,如前所述,会以某种方式阻止调用过程,直到所有指定的事件发生为止,这在JavaScript中当然是不合理的

    因此,首先,我认为您的函数应该需要一个回调,作为它可能唯一的参数,当所有事情最终发生时将调用该回调

    现在–关于“如何优雅地处理步骤1、2和3”…我马上想到的是有限状态机(FSM)算法的概念

    假设您的函数调用导致一个新的“请求”被放置在某个请求表队列上,并且,如果有必要,一个计时器请求(设置为在1毫秒内发出)来服务该队列。(此项将包含对回调的引用等内容。)我们还假设该请求被赋予一个随机字符串“nonce”“这将用于唯一标识它:这将传递给各种外部请求,并且必须包含在它们相应的答复中

    FSM的想法是请求将有一个状态,(属性),例如:
    DOWNLOADING\u FROM\u B
    B\u DOWNLOADS\u COMPLETE
    DOWNLOADING\u FROM\u C
    C\u REQUESTS\u COMPLETE
    ,等等。这样,在这个完全异步过程中起作用的每个回调都将(1)能够通过其nonce来定位请求条目,然后(2)毫不含糊地定位请求条目“知道下一步要做什么”和“分配什么新状态(如果有)”,完全基于对条目的
    状态的检查

    例如,当状态达到
    C\u REQUESTS\u COMPLETE
    时,应该调用最初提供的回调并删除请求表条目

    您可以轻松地映射出任意复杂场景中可能发生的所有“状态转换”(什么状态可以导致什么状态,以及它们发生时要做什么),不管您是否实际创建了一个数据结构来表示所谓的“状态表”,尽管有时候这样做更优雅(!)。(可能混乱的决策逻辑是si
    const sourceA = httpClient.get(/*...*/);
    const sourceB = httpClient.get(/*...*/);
    const sourceC = httpClient.get(/*...*/);
    
     const A = sourceA.pipe(
        switchMap(a => sourceB.pipe(
            map(b => {
                // do some operation using a and b.
                // Return both a and b in an array, but you can
                // also return them in an object if you wish.
                return [a,b]; 
            })
        )),
        switchMap(ab => sourceC.pipe(
            map(c => {
                // do some operations using a, b, and/or c.
                return a;
           }) 
        ))
    );
    
    A.subscribe(a => console.log(a));