forEach内でsetTimeoutが機能しない

ガチョウ :

関数を呼び出す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..)

しかし、そうではありません!実際に表示されるのは、1010回ログに記録された数です(1秒あたり1回)。

「なぜそれが起こるのですか?」すばらしい質問です。閉鎖範囲。forJavaScriptでは、関数(ラムダ)のみにクロージャスコープがあるため、上記ループにはクロージャスコープがありません。

参照: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)が呼び出されたときに、その状態が期待される状態であることに依存できます。

その他のリソース:

JavaScriptクロージャーはどのように機能しますか?

http://javascript.info/tutorial/closures

http://code.tutsplus.com/tutorials/closures-front-to-back--net-24869

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

setTimeoutがSpiderMonkeyで機能しない

分類Dev

setTimeoutがFirefoxで機能しない

分類Dev

setTimeoutがJavaScriptで機能しない

分類Dev

setTimeoutが機能しない

分類Dev

forEach()内のparseFloat()が機能しない

分類Dev

JavaScript asyncawaitがforEachループ内で機能しない

分類Dev

Invoke-WebRequestがForEachループ内で機能しない

分類Dev

setTimeout内でコピー機能が機能しないのはなぜですか?

分類Dev

Javascript forEach()がIEで機能しない

分類Dev

setTimeout内のAngularjsUpdateScope変数が機能しない

分類Dev

setTimeoutが.hover()で機能しないのはなぜですか?

分類Dev

setTimeoutが.hover()で機能しないのはなぜですか?

分類Dev

setTimeout()が機能しないのはなぜですか?

分類Dev

javascript setTimeout()が機能しない

分類Dev

jQuery、setTimeoutが機能しない

分類Dev

componentDidMount()のsetTimeout()が機能しない

分類Dev

setTimeoutが機能しない(JQuery)

分類Dev

JavaScript:setTimeout(setInterval)が機能しない

分類Dev

setTimeoutの関数が機能しない

分類Dev

jQuery setTimeout が機能しない

分類Dev

CoordinatorLayout内でsupportmapfragmentが機能しない

分類Dev

NumberPickerがDialogFragment内で機能しない

分類Dev

PylintがSpyder内で機能しない

分類Dev

clearintervalがngOnDestroy()内で機能しない

分類Dev

GLXGearsがDocker内で機能しない

分類Dev

ScrollViewがCardView内で機能しない

分類Dev

LaravelAutoprefixerがwebpack内で機能しない

分類Dev

TextViewellipsizeがRelativeLayout内で機能しない

分類Dev

$ watchがAngularModal内で機能しない

Related 関連記事

  1. 1

    setTimeoutがSpiderMonkeyで機能しない

  2. 2

    setTimeoutがFirefoxで機能しない

  3. 3

    setTimeoutがJavaScriptで機能しない

  4. 4

    setTimeoutが機能しない

  5. 5

    forEach()内のparseFloat()が機能しない

  6. 6

    JavaScript asyncawaitがforEachループ内で機能しない

  7. 7

    Invoke-WebRequestがForEachループ内で機能しない

  8. 8

    setTimeout内でコピー機能が機能しないのはなぜですか?

  9. 9

    Javascript forEach()がIEで機能しない

  10. 10

    setTimeout内のAngularjsUpdateScope変数が機能しない

  11. 11

    setTimeoutが.hover()で機能しないのはなぜですか?

  12. 12

    setTimeoutが.hover()で機能しないのはなぜですか?

  13. 13

    setTimeout()が機能しないのはなぜですか?

  14. 14

    javascript setTimeout()が機能しない

  15. 15

    jQuery、setTimeoutが機能しない

  16. 16

    componentDidMount()のsetTimeout()が機能しない

  17. 17

    setTimeoutが機能しない(JQuery)

  18. 18

    JavaScript:setTimeout(setInterval)が機能しない

  19. 19

    setTimeoutの関数が機能しない

  20. 20

    jQuery setTimeout が機能しない

  21. 21

    CoordinatorLayout内でsupportmapfragmentが機能しない

  22. 22

    NumberPickerがDialogFragment内で機能しない

  23. 23

    PylintがSpyder内で機能しない

  24. 24

    clearintervalがngOnDestroy()内で機能しない

  25. 25

    GLXGearsがDocker内で機能しない

  26. 26

    ScrollViewがCardView内で機能しない

  27. 27

    LaravelAutoprefixerがwebpack内で機能しない

  28. 28

    TextViewellipsizeがRelativeLayout内で機能しない

  29. 29

    $ watchがAngularModal内で機能しない

ホットタグ

アーカイブ