来自AngularJS,我正在努力解决下一个问题。我需要一个返回对象的函数(让我们称之为 A ,但是在该函数中包含的所有请求得到解决之前,该对象无法返回。该过程应类似于:
我想了解如何使用 rxjs 做这样的事情,但是对于Angular 6,互联网上的大多数示例似乎已被弃用,并且那里的教程并没有真正帮助我。而且我无法修改后端以使其更加优雅。非常感谢。
答案 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_COMPLETE
,DOWNLOADING_FROM_C
,依此类推。这样,将在此完全异步过程中起作用的每个回调将(1)能够通过其随机数找到一个请求条目,然后(2)仅根据对条目C_REQUESTS_COMPLETE
的检查就明确地“知道下一步该做什么”和“要分配什么新状态(如果有)”。
例如,当状态达到state
时,就该调用您最初提供的回调并删除请求表条目了。
您可以轻松地绘制出在任意复杂的情境中可能发生的所有“状态转换”(什么状态可以导致什么状态,以及什么时候做什么),是否实际创建一个数据结构来表示所谓的“状态表”,尽管有时这样做时会更加优雅(!)。 (可能混乱的决策逻辑只是被推到简单的表查询中。)
当然,这是一种经典算法,适用于“阳光下的每种编程语言”,并且已经在其中使用。 (许多硬件设备也使用它。)