2017-07-20 4 views
3

これについての回答があることを知っています!!すべてのアンサーはループ内で1つのsetTimeoutでしかカバーされていません。この質問は私に関連していますHow do I add a delay in a JavaScript loop? 私のシナリオでは、スクリプトで2つのsetTimeoutがあります。プログラムは正しく動作しますが、私が望むタイミングは間違いです!!!javaTimeoutでsetTimeoutが正しく動作しない

function clickDate(i) 
{ 
    setTimeout((function(){ 
    alert("4"); 
    })(),2000); 
} 
function clickButton(i) 
{ 
    setTimeout((function(){ 
    alert("5"); 
})(),4000); 
} 

function doEverything(i) 
{ 
    clickDate(i); 
    clickButton(i); 
} 
for(var i = 0; i < 4; i++) 
{ 
doEverything(i); 
} 
+1

コールバックに使用している構文では、_非常に近いです。 **あなたがリンクしている投稿で使用されているものと同じ**ではありません。 – Mat

+1

'(function(){alert(" 5 ");})()'は直ちに実行される関数で、コードに到達すると直ちに実行され、その結果をコールバックとして渡します。 'function(){alert(" 5 ");}を使用します。 } ' – Kaddath

+0

私は4 5 4 5 4 5 4 5 4 5の順序でアラートをコールバック関数を使用していますが、コールバック関数を使用しないと、私は4 4 4 4と5 5 5を得ています。 – Xameer

答えて

6

setTIMEoutに渡すとすぐに関数が呼び出されます。余分な括弧を削除します。

function clickDate(i) 
 
{ 
 
    setTimeout(function(){ 
 
    alert("4"); 
 
    },2000); 
 
} 
 
function clickButton(i) 
 
{ 
 
    setTimeout(function(){ 
 
    alert("5"); 
 
},4000); 
 
} 
 

 
function doEverything(i) 
 
{ 
 
    clickDate(i); 
 
    clickButton(i); 
 
} 
 
for(var i = 0; i < 4; i++) 
 
{ 
 
doEverything(i); 
 
}

EDIT

それはあなたのコードは、あなたの関数にiを渡しているように私はあなたが使用したいと仮定見てやりたい、まさにそれはちょっと不明ですどういうわけか。現在はすべてを一度に起動するタイムアウトを作成しています。遅延時間を順番に起動させるには、遅延時間をずらす必要があります。以下のコードは、遅延時間にi+1を掛けて、2秒ごとに "4"を、そして "4"秒ごとに "5"を記録します。

// Currently this code displays a 4 every 2 seconds and a 5 every 4 seconds 
 
function clickDate(i) 
 
{ 
 
    setTimeout(function(){ 
 
    console.log("4"); 
 
    },2000 * (i+1)); 
 
} 
 
function clickButton(i) 
 
{ 
 
    setTimeout(function(){ 
 
    console.log("5"); 
 
},4000 * (i+1)); 
 
} 
 

 
function doEverything(i) 
 
{ 
 
    clickDate(i); 
 
    clickButton(i); 
 
} 
 
for(var i = 0; i < 4; i++) 
 
{ 
 
doEverything(i); 
 
}

+0

これはまた、タイミングの問題があります。 –

+0

あなたの回答はタイミング問題を解決しますが、アラートは同期していません!!出力は4 4 4 4、次に5 5 5 5です。 – Xameer

+0

OPはコードがしたいことについてはっきりしていなかったので、私はそれほど多くのことを想定しないようにしました。ただし、アラートを使用することは、タイミングが実際にどのように機能するかについての良い考えを与えるものではないため、悪い考えです。さらに、あなたのforループは基本的に一度にタイムアウトの束を作成します。あなたが期待しているような間隔ではないでしょう。 (簡単にするため、タイムアウト時間にi + 1を掛けるだけです)。 –

1

こんにちは、私はあなたがjavascriptのについてのドキュメントを読んでhaventはと思います。 これは非同期で、イベントを待ってプロセスを続行しません。私は答えを与えるだろうが、私は非常にあなたの両方の関数が同時に呼び出されるので、タイミングの問題を取得しますここであなたに良いJavascriptについて読むことを強くお勧めします。私に例を挙げましょう。

function clickDate(i,callback) 
{ 
    setTimeout(function(){ 
    alert("4"); 
    callback();//this will call anonymous function in doEverything 
    },2000); 
} 
function clickButton(i) 
{ 
    setTimeout(function(){ 
    alert("5"); 
},4000); 
} 

function doEverything(i) 
{ 
    console.log("In loop index is " , i); 
    clickDate(i,function(){ 
     clickButton(i); 
    }); 
    //look closely here I have passed the function in changeData and will call that funtion from clickDate 
    console.log("In loop terminating index is " , i); 
} 
for(var i = 0; i < 4; i++) 
{ 
doEverything(i); 
} 

だからここコンソールログは、非同期 機能についてあなたが明確になります。 forループが終了すると、ループが終了します。 2秒後に完了しますので、最初の警告の前にループ for it iterationが完了します。

これが役に立ちます。

0

ファンクションの最後に()を追加することでコールバックを直ちに呼び出すことになります。

あなたは時間切れでコールバックを渡す必要があり、このいずれかを試して、あなたのため

setTimeout(function(){ 
alert('hello'); 
} , 3000); 
+0

私は2つのsetTimeoutを同期しながら話しているだけではない! – Xameer

+0

'setTimeout'で正確に実行したいもの – Ali

+0

私は' setTimeout'をしたいですが、私は2つの 'setTimeout'を必要としています。 – Xameer

0
function functionName() { 
    setTimeout(function(){ //Your Code }, 3000); 
} 

を呼び出します。

関連する問題