我最近开始学习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并且我留下了未定义的返回结果。我发现修复此问题的唯一方法是将其余代码移到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会在这个简单快速的情况下使用promises。来自经验丰富的JS /承诺编码员的任何建议?
答案 0 :(得分:3)
或许vimeo getCurrentTime
函数是异步的 - 所以使用promises而不是回调例如,使得它更具街头信誉 - 因为," Promises&#34 ;,像领结一样,很酷:p
无论如何,去" DRY"你的代码,你只需在Promise.resolve()
中从youtube返回getCurrentTimevar 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
}