関数を呼び出すforEachがあります。呼び出されるたびに遅延が必要です。forEach内のsetTimeout内に配置しました。最初の待機後のタイムアウトは考慮されません。代わりに、一度待ってから、すべてを一度に実行します。タイムアウトを5秒に設定し、コンソールを使用して確認しています。5秒間待機すると、いくつかのfoobarコンソールが一度にログに記録します。
なぜこの動作になるのですか?
var index = 0;
json.objects.forEach(function(obj) {
setTimeout(function(){
console.log('foobar');
self.insertDesignJsonObject(obj, index);
}, 5000);
});
ジェイソンが言ったことは彼の答えは完全に正しいですが、私はもっと明確にするために私はそれに挑戦するつもりだと思いました。
これは実際には古典的な閉鎖問題です。通常は次のようになります。
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},i * 1000)
}
初心者は、コンソールが次のように表示されることを期待します。
0
(0 seconds pass...)
1
(1 second passes...)
2
(etc..)
しかし、そうではありません!実際に表示されるのは、10
10回ログに記録された数です(1秒あたり1回)。
「なぜそれが起こるのですか?」すばらしい質問です。閉鎖範囲。for
JavaScriptでは、関数(ラムダ)のみにクロージャスコープがあるため、上記のループにはクロージャスコープがありません。
参照:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
しかしながら!あなたがこれを試した場合、あなたの試みは望ましい出力を達成したでしょう:
json.objects.forEach(function(obj,index,collection) {
setTimeout(function(){
console.log('foobar');
self.insertDesignJsonObject(obj, index);
}, index * 5000);
});
"closur-ed" index
変数にアクセスできるため、関数(lambda)が呼び出されたときに、その状態が期待される状態であることに依存できます。
その他のリソース:
http://javascript.info/tutorial/closures
http://code.tutsplus.com/tutorials/closures-front-to-back--net-24869
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加