1

私は自分の値のすべてに対して正しいi値を取得する必要がありresponseます(JSONロード)。それ、どうやったら出来るの?

10個のJSONファイルがあるとしましょう。それらはすべて、適切な順序でロード、保存、およびクライアントに表示される必要があります。

したがって、次のようになります。

for (var i = 0; i < files.length; i++) {
    $.getJSON(files[i], function (response) {
        console.log(i);
        console.log(response);
    });
}

の結果は、response私たちが期待するものです-ファイルの内容ですが、変数iは常に同じように見えます(= files.length)。これについての私の説明は、JSは特定のアクションが完了するのを待つ言語ではなく、同時に多くのアクションを実行できるということです(これの学名を忘れました)。

4

1 に答える 1

4

この問題は、コールバックが登録時に有効な値を閉じていないという事実に起因しています。iすべてのコールバックは、の同じインスタンスを参照します。iこれは、ループが完了した後の値(つまりfiles.length)を持つことになります。

jQueryを使用して行うのが賢明なことは、$.eachコーダーが言うように使用することです。しかし、純粋なJavaScriptでそれを解決する方法は次のようになります。

for (var i = 0; i < files.length; i++) {
    (function(idx) {
        $.getJSON(files[idx], function (response) {
            console.log(idx);
            console.log(response);
        });
    })(i);
}

匿名関数を作成し、すぐに呼び出すことで、その関数にスコープされたiという名前の新しいローカル変数に値を再バインドします。idxその後、各コールバックは独自のを実行idxするため、正しい値をログに記録することになります(i後でコールバックになったものではなく、コールバックを登録したときの値)。インデックスをパラメーターとして受け取る無名関数を渡した$.eachので、これは実際にはを使用したときに起こっていることとまったく同じです。each

于 2013-02-16T04:33:09.373 に答える