突破了多个类/方法的承诺链

问题描述 投票:0回答:2

语言:打字稿3.5x

环境:Angular 8.x,RxJS 6.x

[我正在尝试找出如何摆脱看起来像这样(简化)的承诺链:

ClassA.methodA1 is called

 -methodA1 does an if/then check and if true, calls ClassB.methodB1

 --methodB1 calls a different function and combines the results with a parameter passed to it, and ultimately calls ClassC.methodC1

 ---methodC1 does some validation and then calls ClassD.methodD1 if valid

 ----methodD1 makes an async call (to a DB) and waits for it to finish before returning back the value it received (an ID).

When methodA1 receives the id, it calls ClassA.methodA2 and passes that Id in as a parameter

methodD1调用的方法在我的控制范围之外,并返回一个Promise。我无法改变。但是,我需要methodA1等待直到methodD1完成,并且它接收到ID-每个干预方法都只是将该返回值传递回其调用者。

即使此简化版本也有气味。不需要干预的任何方法(方法B1或methodC1,实际代码中实际上还有2种方法)都是异步的。它们当前的唯一原因是我需要一切,直到methodD1完成后再继续。每个干预方法仅返回从其调用的方法返回的Promise。

我用async / await进行了重构,尽管代码更少,但它仍然是一系列方法,它们只是简单地传递从方法调用中接收到的返回值以备份链,并且仍然存在大量不必要的async / await。干预方法。

我重构为RxJS主题,并让methodA1订阅,然后在完成时methodD1调用.next(id),但这并没有什么感觉。我的应用程序中可能会有数十个类似的流程,这感觉就像走主题路由会增加很多额外的开销,并保持哪个订阅响应属于哪个订阅实例会很麻烦。

我的直觉告诉我主题路线是正确的方法,但是我想知道是否缺少某些东西可以使它更整洁。是否存在一些内置机制来标记对给定订阅实例的订阅响应,以便订阅代码仅处理对ITS调用的响应,然后取消订阅?

我能想到的唯一的其他方法,只是简单的[[UGLY是将我的ClassA实例一直传递到ClassD,并在从数据库接收到ID时让ClassD调用methodA2。但这更糟。

我缺少什么吗?如果是这样,该怎么办?任何指导或模式参考,不胜感激。
javascript typescript promise rxjs6
2个回答
0
投票
我唯一想到的另一种方法是将我的ClassA实例一直传递到ClassD,并在从数据库接收到ID时让ClassD调用methodA2。但这更糟。

从本质上讲,这是一个回调(实例接收方法调用,而不是调用普通函数)通常被认为比仅返回promise更糟糕。

注意,如果只有组件D执行对数据库的调用(它们是异步的),并且所有其他模块都依赖于D,因为它们执行使用数据库的操作,那么您的原始方法没有什么问题,那么其他模块自然会变为异步的也一样然后,处于尾部位置的异步(承诺返回)调用似乎是一个巧合,如果组件要依次执行多个db调用,则异步调用可能会更改。

但是,您仍然错过了另一种方法。当所有函数仅对参数进行某种组合/转换/验证,最后将它们传递给其他方法时,该方法才适用。与其让B本身调用C,还不如直接将已验证的参数返回给A,然后让A直接调用C。这将使B和C完全同步并且可以进行单元测试,并且只有A调用D的异步方法。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.