2017-01-31 5 views
-1

最近私はJSの約束について学び始めたので、私はVimeoのビデオプレーヤーAPIとインターフェースでき、少し混乱してしまいました。私は非常に同期的/連続的なバックグラウンド(たくさんのC++)から来ているので、JSの非同期の性質は私が完全に理解するのが難しい時代です。JSの約束の使い方を理解する

私はビデオ

`player.getCurrentTime().then(function(seconds) { 
    //seconds is what I am looking to get 
})` 

また、私は同様の目的のために(下)YouTubeのAPIを使用しています

player.getCurrentTime() 
の現在の再生時間を取得するために(下)VimeoののAPI関数を呼び出ししようとしています

ここで混乱が起こります。 Vimeoは約束を使用していて、あなたが知っている限り、私はyoutubeが知りません。だから私が次のようなことをするとき、私は問題はなく、すべてが私には意味をなさない。私はVimeoののAPIと同じことをすれば

someFunction() { 
    var time = player.getCurrentTime(); 
    return time; 
} 

は、しかし、私は約束は私のreturnステートメントの前に戻っていないとの問題があると私は未定義の戻り結果を残しています。私がこれを修正するために見つけた唯一の方法は、残りのコードを約束の中に移動することです。しかし、私の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 
    }) 
} 

ユーチューブのアプローチは限りVimeoのは、この単純な、高速な場合には約束を使用する理由私は思ってしまうのコードや理解の単純さの量としてはるかに効率的と思われます。経験豊富なJS/promiseコーダーからのアドバイスはありますか?

+1

が非同期Vimeoの方法に対応ユーチューブ方法をpromisifyにユーチューブからgetCurrentTimeを返すことができます。勝利に勝つ。 –

+0

私は@Meierに同意しない。私は、コードの大部分をコピーして貼り付けることを避け(以下の有益な答えによって提供される)、アプローチの違いを反映させる方法があるかどうかを尋ねていました。 –

答えて

3

おそらくVimeoのgetCurrentTime関数は非同期です - ので、例えば約束ではなく、コールバックを使用して、より多くのストリートクレドと、それはクーラー作る - 蝶ネクタイのような「約束」は、涼しいです、ので:とにかくP

、 「DRY」あなたのコードに、あなたは、単にPromise.resolve()

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 
} 
+0

'promse'は' promise'でなければなりません。そうでなければコードは動作しません – rabbitco

+0

タイプミスのおかげでありがとう:p –

+0

ありがとう、これは動作します! –