我应该一直都在兑现诺言吗?

时间:2020-05-31 03:15:26

标签: javascript typescript promise

我一直在从PlayersController代码的几个点调用方法MediaNext()来链接下一次Media播放(如果有)。

  • 此MediaNext()方法从内存中拥有的各种播放列表中返回一个Media对象。因此,它尝试封装获取下一个Media对象(如果还有)的概念。
  • 但是,最近我修改了MediaNext(),对于某些新条件X,现在我必须加载外部数据才能返回此替代Media对象。
MediaNext():any {  // any could be typed like Media_I
   if(cond1) {
      ...
      return Media1
    }
   if(cond2) {
      ...
      return Media1
    }
    //
    if(! AutoPlayNext) return null;
    //
    if(NoMoreMedia) return null;
    //
    If (condX) {
      // in order to wait for the Load() method I am subscribing to its promise
      this.Service1.Load(Media).then(() => {
         ...processing...
         return Media
      })
      ??? what do I return here, it does not make sense to return null, since potentially a Media is on its way ???
    }
    return null // safe catch. nomore media should not happen.
}

我有问题

  1. 通过遵守.Load()的承诺,不应阻止我在JS中收集的内容的执行,以等待媒体数据返回。相反,需要执行流程,并且必须返回对MediaNext()的调用。但是,在“ ???”上面的代码中指示的位置我应该返回什么。

  2. 是否应该对MediaNext()进行编码以在所有条件下返回承诺?

当我编写承诺和可观察性代码时,我大多会猜测工作,因为它们仍然是理解和掌握的野兽,所以随时建议替代方案。

谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您异步处理.Load并立即返回,则没有充分的理由使该函数返回任何内容。该操作仍在后端进行。

但是,如果您希望调用方获得有关该操作是否成功的更多信息,则应返回一个承诺。

如果您想返回一个承诺,您可能会发现将其编写为异步函数并使用await this.Service1.Load()会容易得多。而不是then()

答案 1 :(得分:0)

您的方法现在是异步的,并且您正在使用Promise。然后,您需要返回一个承诺,您的消费者可以等待获得结果。要么:

1)兑现诺言

    If (condX) {
      return this.Service1.Load(Media);
    }

2)将您的方法设置为异步并等待内部使用的诺言

async MediaNext():any {  // any could be typed like Media_I
    // ...

    If (condX) {
      return await this.Service1.Load(Media);
    }

    // ...