JavaScriptでは、関数を使用してコードの実行を一時停止する方法はありませんsleep
。JavaScriptコードの実行は、非ブロッキングになるように設計されています。
キーワードを使用した解決策はdebugger
Chromeでも機能します。開発者ツールを開くだけです。
動作の異なるデモを用意しました。sleep
を使用して関数をシミュレートしsetInterval
、スクリプトの実行をブロックしません。ただし、いくつかの追加コードが含まれます。
初期コードがあると仮定しましょう:
var arr = [0, 1, 2, 3, 4];
function step(val) {
console.log(val);
}
for (var i = 0, len = arr.length; i < len; i++) {
step(arr[i]);
}
ここで、各ログが1秒後に表示されるように書き直します。
var arr = [0, 1, 2, 3, 4],
steps = [];
function step(val) {
console.log(val);
}
for (var i = 0, len = arr.length; i < len; i++) {
steps[i] = step.bind(null, arr[i]);
}
var int = setInterval(function() {
var fun = steps.shift();
if(!fun) {
clearInterval(int);
return;
}
fun();
}, 1000);
少し説明させてください。まず、steps
配列を定義します。ここに、バインドされた引数を持つ新しい関数を配置します。bind
functionは基本的に、提供された値にバインドされた引数を使用して新しい関数を作成します。MDNページの詳細。
例:
function step(a) { console.log(a); }
var step1 = step.bind(null, 1);
// now step1 is like `var step1 = function() { console.log(1); }`
ループではfor
、を使用して新しい関数を作成して配置しbind
ます。最後のステップは、これらの関数をsteps
最初から(メソッドを使用して)配列から抽出Array.prototype.shift
し、1秒に等しい間隔で実行することです。
それがあなたの問題の直接的な解決策ではないことは知っていますが、それがあなたのコードを適切に変換するのに役立つことを願っています。そうすることにした場合はfor
、while
ループ内のコードブロックを関数に変換することをお勧めします。変換が少し簡単になります。