Javascript 了解如何使用JS承诺
我最近开始学习JS承诺,这样我就可以与Vimeo的视频播放器API接口,他们让我有点困惑。我来自一个非常同步/连续的背景(很多是C++),所以JS的异步特性有时让我很难完全理解 我试图调用Vimeo的API函数(如下)来获取视频的当前播放时间Javascript 了解如何使用JS承诺,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,我最近开始学习JS承诺,这样我就可以与Vimeo的视频播放器API接口,他们让我有点困惑。我来自一个非常同步/连续的背景(很多是C++),所以JS的异步特性有时让我很难完全理解 我试图调用Vimeo的API函数(如下)来获取视频的当前播放时间 `player.getCurrentTime().then(function(seconds) { //seconds is what I am looking to get })` 此外,我使用Youtube的API(如下)也有类似的用途 p
`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做同样的事情,我会对在返回语句之前不返回的承诺产生问题,并且我会得到一个未定义的返回结果。我发现解决这个问题的唯一方法是将其余代码移到promise中。但是,我的web应用程序将与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会在这种简单、快速的情况下使用承诺。有经验的JS/promise程序员有什么建议吗?也许vimeo
getCurrentTime
函数是异步的-因此使用promises,而不是回调,会让它更酷,更具街头信誉-因为“promises”,就像蝴蝶结一样,很酷:p
无论如何,要“干燥”代码,只需在Promise.resolve()中从youtube返回getCurrentTime
介绍与异步vimeo方法相对应的youtube方法。双赢。我不同意@Meier。我在问是否有一种方法可以避免复制和粘贴大量代码(由下面的有用答案提供),然后只考虑方法的不同。
promse
应该是promise
——否则代码将无法工作
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
}