2017-12-08 10 views
0

私はこのforの文をどのように時間を計るかを考え出しているので、1秒おきに発生します。何が起こるのかは、xが、タイムアウトが発生する前にループがループしているので、すべてのログに対して5を出力するということです。 setTimeoutの終了後にすべての反復が行われるように、ループをどのように時間を計ることができますか。javascriptの動作を正しい順序で実行する方法

for (x = 0; x < 5; x++) { 
 
    var wait = setTimeout(function() { 
 
    console.log(x,"x"); 
 
    }, 800); 
 
}

+0

のsetTimeoutコード内の次のタイムアウトを設定します。 –

+0

私はあなたにアレックスに従うか分からない。これを具体的に説明できますか – Kostis

+0

setTimeout()を1回呼び出し、800ms後に実行するように指定したコードで、最後にもう一度setTimeout()を呼び出します。 –

答えて

1

使用let x = 0xブロックがループの中でスコープであることを確認して、それぞれの遅延時間をインクリメントするために、遅延時間指数を乗算する

for (let x = 0; x < 5; x++) { 
 
    setTimeout(function() { 
 
    console.log(x, " x") 
 
    }, (x + 1) * 800); 
 
}

+0

私はこれが私を最も助けたと思う。 charlietflには 'x'に時間を掛ける特別な理由はありますか? – Kostis

+0

ループはミリ秒単位で完了します...すべての遅延が同時に実行されないように遅延を増やすことを前提としています。 – charlietfl

+0

重要な記事[ループ内のJavaScriptクロージャー - 簡単な実用的な例](https://stackoverflow.com/questions/) 750486/javascript-closure-inside-loops-simple-practical-example) – charlietfl

0

私はこれがあなたがやろうとしていることだと思います:ここ

for (x = 0; x < 5; x++) { 
 
    (function(n){setTimeout(()=>{console.log(n,"x");},800*n);})(x); 
 
}

1

他の回答もちろん正しいです。

将来の非同期コードへの移行は、async/awaitを使用する方がずっと簡単です。

これは単純な例です。ユーティリティの機能の遅延のために、最初は長くなりますが、async/awaitを使用するとプログラムが大きくなるので、コードの実行がずっと簡単になります。

ここでも、1つのsetTimeoutが作成されます。潜在的により多くのリソースにやさしい。 async/awaitを使わずに1つのsetTimeoutを使うこともできますが、setTimeoutを連鎖させてコードをさらに難しくする必要があります。

// utility function do delay, 
 
// can be used again.. 
 
function delay(ms) { 
 
    return new Promise((resolve) => { 
 
    setTimeout(resolve, ms); 
 
    }); 
 
} 
 

 
//await can only be called from async function. 
 
//so lets just create run function to get things started. 
 

 
async function run() { 
 
    for (let x = 0; x < 5; x++) { 
 
    await delay(800); 
 
    console.log(x,"x"); 
 
    } 
 
} 
 

 
//lets get things started.. 
 
run();

+0

これはキースにありがとうございます。私もこれを勉強します! – Kostis

関連する問題