【发布时间】: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