Mic*_*amp -1 javascript promise ecmascript-6
我最近开始学习 JS 承诺,以便我可以与 Vimeo 的视频播放器 API 交互,但它们让我有点困惑。我来自一个非常同步/顺序的背景(很多 C++),所以有时我很难完全理解 JS 的异步特性。
我正在尝试调用 Vimeo 的 API 函数(如下)来获取视频的当前播放时间
`player.getCurrentTime().then(function(seconds) {
//seconds is what I am looking to get
})`
Run Code Online (Sandbox Code Playgroud)
此外,我将 Youtube 的 API(如下)用于类似目的
player.getCurrentTime()
Run Code Online (Sandbox Code Playgroud)
现在混乱来了。Vimeo 使用承诺,据我所知 youtube 没有。因此,当我执行以下操作时,我没有任何问题,一切对我来说都有意义。
someFunction() {
var time = player.getCurrentTime();
return time;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我对 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
})
}
Run Code Online (Sandbox Code Playgroud)
就代码量和理解的简单性而言,youtube 方法似乎更有效,这让我想知道为什么 Vimeo 会在这种简单、快速的情况下使用 promise。有经验的 JS/promise 编码员有什么建议吗?
也许 vimeogetCurrentTime函数是异步的——所以使用承诺,而不是例如回调,让它更酷,有更多的街头信誉——因为,“承诺”,就像领结一样,很酷: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
}
Run Code Online (Sandbox Code Playgroud)