2017-05-11 16 views
2

私の目標は、配列を反復処理し、配列の各要素の値をキー として取得し、その値に関連付けられたサウンドクリップを再生することです。最終的な結果は、配列内のキーの順番でサウンドクリップを連続して再生することです。このコードが反復シーケンスをHTML5オーディオファイルを反復する

//there are addresses associated with the color sound values 

function playSound(soundValue){ 
    $sound.src = soundValue; 
    $sound.load(); 
    $sound.play(); 
} 

function playGame(){ 
    simonSays = [0,1,2,3]; 

    var soundOptions = { 
    0: yellowSound, 
    1: redSound, 
    2: blueSound, 
    3: greenSound 
    }; 

    for (var i = 0; i < simonSays.length; i++){ 
    var callSound = soundOptions[simonSays[i]]; 
    setTimeout(playSound(callSound),1000); 
    } 
}; 

と フィニッシュへsetTimeout期間を待たない:ここで

は、私がこれまで試してみましたものです。私は、このエラーが表示されます。

Uncaught (in promise) DOMException: The play() request was interrupted by a new load request. 
    playSound @ logic.js:72 
    playGame @ logic.js:120 
    onclick @ index.html:37 

私の理解では、オーディオファイルが互いにinterferringと エラーを生成していることであるが、さらに 各ファイルが完了することができますシーケンスによる反復における遅延はありません。私は$sound.endedまたは$sound.onendedへのメディアの実行 どちらもコールを遅延させるための他の努力の が先にオーディオファイル完了の 繰り返しを防ぐことができましたthese examplesを見ました。このプロジェクトは配列の長さと順序を増やすので、配列の各メンバーの実行を制御するための方法が 必要です。

誰でもアドバイスをいただけますか?ありがとうございました。

答えて

1

setTimeoutはループを遅延させません。このループにより、すべてのオーディオファイルが1秒間だけ遅延します。その解決方法は次のような関数にループを入れることです:

simonSays = [0,1,2,3]; 

var soundOptions = { 
    0: yellowSound, 
    1: redSound, 
    2: blueSound, 
    3: greenSound 
}; 

function playGame(){ 
    startPlaying(0,simonSays.length); 
}; 

function startPlaying(i,l) { 
    if (i==l) return; 
    var callSound = soundOptions[simonSays[i]]; 
    playSound(callSound); 
    setTimeout("startPlaying("+(i+1)+","+l+")",1000);  
} 
+0

私は再帰呼び出しが本当に好きですが、まだエラーが発生しています。 '' 'setTimeout'''を文字列として呼び出すと、このエラーが発生します。' '' Uncaught ReferenceError:iは定義されていません at :1:14''' '' 'startPlaying (i + 1、l) '' '文字列ではなく、オリジナルの問題と同じように、オーディオファイルを呼び出さずに全範囲を循環するのと同じ効果を作り出します。何かご意見は?あなたの時間をありがとう。 – Cameron

+0

私はその問題に気付かなかった。私は自分の投稿を編集しました。それが動作すれば教えてください!あなたが持っているhtmlを再現するのは難しいので、この種の問題をデバッグするのは難しいです。 –

+0

パーフェクト!文字列と数値の組み合わせが完全に機能するように、関数呼び出しを正確に書くことが私の問題でした。これは素晴らしい解決策でした。あなたの時間をありがとう。 – Cameron