【问题标题】:Should I have been returning a promise all along?我应该一直在回报一个承诺吗?
【发布时间】:2023-03-15 07:53:01
【问题描述】:

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

  • 此 MediaNext() 方法从内存中的一些不同播放列表中返回一个 Media 对象。因此,它尝试封装获取下一个 Media 对象(如果有的话)的概念。
  • 但是,最近我修改了 MediaNext(),对于某些新条件 X,我现在必须加载外部数据才能返回此替代媒体对象。
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() 进行编码以针对所有条件返回一个承诺?

当我编写 Promise 和 observables 时,我主要做猜测工作,因为它们仍然是一个难以理解和掌握的野兽,所以请随意提出替代方案。

感谢您的帮助。

【问题讨论】:

  • 是的,从mediaNext()返回一个承诺

标签: javascript typescript promise


【解决方案1】:

您的方法现在是异步的,并且您正在使用 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);
    }

    // ...

【讨论】:

    【解决方案2】:

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

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

    如果你想返回一个 Promise,你可能会发现把它写成一个异步函数更容易,并使用await this.Service1.Load()。而不是then()

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2015-11-27
      • 2015-06-05
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多