【问题标题】:Understanding how to use JS promises了解如何使用 JS 承诺
【发布时间】:2017-01-31 22:19:15
【问题描述】:

我最近开始学习 JS 承诺,以便我可以与 Vimeo 的视频播放器 API 交互,但它们让我有些困惑。我来自非常同步/顺序的背景(大量 C++),所以 JS 的异步特性有时让我很难完全理解。

我正在尝试调用 Vimeo 的 API 函数(如下)来获取视频的当前播放时间

`player.getCurrentTime().then(function(seconds) {
     //seconds is what I am looking to get
})`

此外,我正在使用 Youtube 的 API(如下)用于类似目的

player.getCurrentTime()

现在混乱来了。 Vimeo 使用承诺,据我所知 youtube 没有。因此,当我执行以下操作时,我没有任何问题,一切对我来说都有意义。

someFunction() {
    var time = player.getCurrentTime();
    return time;
}

但是,如果我对 Vimeo 的 API 做同样的事情,我会遇到承诺在我的 return 语句之前没有返回的问题,并且我得到了一个未定义的返回结果。我发现解决此问题的唯一方法是将其余代码移动到 Promise 中。但是,我的网络应用程序将与 youtube 和 vimeo 兼容,因此我经常遇到必须复制大块代码的问题,例如以下情况。

if (playerType == "youtube") {
  time = player.getCurrentTime();
  //large chunck of code relying on the time returned
} else if (playerType == "vimeo") {
  time = 0;
  player.getCurrentTime().then(function(seconds) {
    time = seconds;

    //copied large chunck of code relying on the time returned
  })
}

就代码量和理解的简单性而言,youtube 方法似乎更有效,这让我想知道为什么 Vimeo 会在这种简单、快速的情况下使用 Promise。有经验的 JS/promise 编码员有什么建议吗?

【问题讨论】:

  • 承诺对应异步 vimeo 方法的 youtube 方法。赢得胜利。
  • 我不同意@Meier。我在问是否有办法避免复制和粘贴大部分代码(由下面的有用答案提供),然后只是反映方法的差异。

标签: javascript ecmascript-6 promise


【解决方案1】:

也许 vimeo getCurrentTime 函数是异步的 - 所以使用承诺,而不是回调,例如,使用更多的街头信誉让它更酷 - 因为,“承诺”,就像领结一样,很酷:p

无论如何,要“干燥”您的代码,您只需在 Promise.resolve() 中从 youtube 返回 getCurrentTime

var promise;
if (playerType == "youtube") {
    promise = Promise.resolve(player.getCurrentTime());
} else if (playerType == "vimeo") {
    promise = player.getCurrentTime();
}
promise.then(function(seconds) {
    time = seconds;
    //large chunck of code relying on the time returned
}

【讨论】:

  • promse 应该是 promise - 否则代码将无法工作
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2016-05-25
  • 2017-05-18
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多