提问者:小点点

NodeJS服务层异步通信


如果由于调用ServiceA.Action而必须调用ServiceB.Action,我是应该在适当的时候从ServiceA.Action调用ServiceB.Action,还是应该从ServiceA发出事件并让ServiceB对该事件作出反应?

我可以使用EventEmitter,但它是同步工作的,从某种意义上说,回调是按顺序调用的,而不需要等待前一个来解析,这对我来说是可以的。 但是,$emit不会等到所有侦听器都解析完毕。

对于更真实的场景,让我们假设我有一个订阅服务,当创建一个新的订阅时,电子邮件服务需要知道它,以便它可以通过电子邮件通知某人。

const SubscriptionService = {
  async create(user) {
    await Subscription.create(user)
   
    // Notify email service
  }
}

const EmailService = {
    async notify(user) {...}
}

我可以这样做的一种方法是从subscriptionservice.create调用emailservice.notify(user)并传入用户。

另一种方法是使用事件发射器

async create(user) {
    await Subscription.create(user)

    Emitter.$emit('subscription', user)
}

第二种方法似乎很干净,因为我没有把事情混在一起,通知是创建订阅的结果,并且create方法没有受到额外逻辑的污染。 此外,添加更多的副作用,如通知,将更简单。

但是,订阅服务的create方法不会等到所有侦听器都解决了,这是一个问题。 通知失败怎么办? 在这种情况下,用户将不会收到电子邮件。 那么错误处理呢? 在第一个场景中,我可以在调用EmailService.Notify时现场处理错误,但不能使用发射器。

不是为了类似的用例,还是我以错误的方式看待问题?


共1个答案

匿名用户

由于create方法返回一个Promise,因此您可以执行以下操作:

SubscriptionService.create(user).then((user) => EmailService.notify(user));

注意:以上内容取决于调用这些方法的位置和方式。

相关问题