了解如何使用JS承诺

时间:2017-01-31 22:19:16

标签: 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(下面)用于类似目的

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 /承诺编码员的任何建议?

1 个答案:

答案 0 :(得分:3)

或许vimeo getCurrentTime函数是异步的 - 所以使用promises而不是回调例如,使得它更具街头信誉 - 因为," Promises&#34 ;,像领结一样,很酷:p

无论如何,去" DRY"你的代码,你只需在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
}