Angular 6避免回调地狱

时间:2018-11-06 17:39:39

标签: rxjs angular6

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

  1. 对象 A 是从远程服务器下载的
  2. 使用 A ,我们对另一个对象( B )进行操作
      从服务器下载了
    1. B
    2. 已使用 A 中的某些属性修补了
    3. B
  3. 使用 A B 的结果,我们对第三个对象 C 进行操作
      从服务器下载了
    1. C
    2. C 已使用 A B
    3. 中的某些属性进行了修补
  4. 处理 B C 后,该函数必须返回 A

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

2 个答案:

答案 0 :(得分:3)

请考虑以下可观察对象:

FormattedText

Range是Angular的HTTPClient

您描述的操作顺序如下:

    Word.Table tbl = doc.Tables[1];
    Word.Range rngCellSource = tbl.Cell(1, 1).Range;
    Word.Range rngCellTarget = tbl.Cell(2, 1).Range;
    rngCellSource.MoveEnd(Word.WdUnits.wdCharacter, -1);
    //System.Diagnostics.Debug.Print(rngCellSource.Text);
    rngCellTarget.Collapse(Word.WdCollapseDirection.wdCollapseStart);
    rngCellTarget.FormattedText = rngCellSource.FormattedText;

现在,您只需要订阅const sourceA = httpClient.get(/*...*/); const sourceB = httpClient.get(/*...*/); const sourceC = httpClient.get(/*...*/);

httpClient

您可以了解有关RxJs运算符here的信息。

答案 1 :(得分:-1)

首先,在我看来,如前所述,此函数调用将以某种方式希望阻止,直到所有指定的事件发生为止–当然在JavaScript中是不合理的。

因此,首先,我认为您的函数应该要求 callback 作为其唯一的参数,当所有事情都发生时将被调用。

现在-关于“如何优雅地处理步骤1、2和3” ... ...立即想到的是有限状态机(FSM)的概念算法。

假设您的函数调用将新的“请求”放置在某个请求表队列中,并在必要时添加了一个计时器请求(设置为在1毫秒内关闭)以服务该队列。 (除其他事项外,(该条目将包含对回调的引用。)我们还假定给该请求一个随机字符串“ nonce”,该字符串将唯一地标识该请求:它将被传递给各种外部请求,并且必须包含在其相应的答复中。

FSM 的想法是请求将具有 状态 (属性),例如:DOWNLOADING_FROM_B,{ {1}},B_DOWNLOADS_COMPLETEDOWNLOADING_FROM_C,依此类推。这样,将在此完全异步过程中起作用的每个回调将(1)能够通过其随机数找到一个请求条目,然后(2)仅根据对条目C_REQUESTS_COMPLETE的检查就明确地“知道下一步该做什么”和“要分配什么新状态(如果有)”。

例如,当状态达到state时,就该调用您最初提供的回调并删除请求表条目了。

您可以轻松地绘制出在任意复杂的情境中可能发生的所有“状态转换”(什么状态可以导致什么状态,以及什么时候做什么),是否实际创建一个数据结构来表示所谓的“状态表”,尽管有时这样做时会更加优雅(!)。 (可能混乱的决策逻辑只是被推到简单的表查询中。)

当然,这是一种经典算法,适用于“阳光下的每种编程语言”,并且已经在其中使用。 (许多硬件设备也使用它。)