2

URL の配列と、外部から取得するデータの配列があります。URL とデータは 1 対 1 で完全に対応しています。私はこれをしようとします:

for (var i = 0; i < children.length; i++) {
    urls.push(children[i].data.url); 
}

for (var i = 0; i < children.length; i++) { 
    $.ajax({
         url: DATA_SOURCE,
         dataType: "jsonp",
         success: function (data2) {                           
             console.log(urls[0]);
             console.log(urls[i]);
         }
    });                        
}

最初のログは、常にurls配列の最初の要素を出力します。番号を他の有効なインデックスに変更でき、機能します。ただし、2 番目のログは常に出力されundefinedます。最初は 2 番目のループ内から URL を取得しましたが、非同期エラーか何かであることが判明した場合に備えて、それを取り出しました。ではなく にurls初期化されます。成功関数から (そして for ループのメイン スコープに) 2 番目のログを取得すると、期待どおりに実行されます。ajax リクエストが何らかの形でそれを台無しにしていることを喜んで説明したいと思いますが、最初のログが期待どおりに機能するのはなぜですか?ArrayObject

何か案は?

4

3 に答える 3

2

$.ajax は非同期です。つまり、コールバック (成功) が実行されると、ループは既に実行を終了しており、children.length に設定されています。

urls[ i ] へのアクセスは、urls[ children.length と等しいため、未定義です。

これを簡単に修正するには、反復ごとにスコープを作成します。

for (var i = 0; i < children.length; i++) { 
  (function( index ) {
    $.ajax({
       url: DATA_SOURCE,
       dataType: "jsonp",
       success: function (data2) {                           
         console.log(urls[ index ]);
        }
    }); 
  })( i );                       
}
于 2012-10-18T07:12:56.360 に答える
1

Pantelisの答えに+1しますが、ほんの少し衒学的な発言です。ajax呼び出し全体をIIFEでラップする必要はなく、成功コールバックのみがの「現在の」値を参照する必要がiあるため、これで問題ありません。

for (var i = 0; i < children.length; i++)
{
    $.ajax({
       url: DATA_SOURCE,
       dataType: "jsonp",
       success: ((function( index ) 
       {
           return function (data2)
           {
               console.log(urls[ index ]);
           };
       })(i)
    });
}
于 2012-10-18T07:24:47.140 に答える
0

これは、success 関数が最後に呼び出されたときに i が未定義であるためです。i の現在の値を、生成している成功関数に渡す必要があります。

for (var i = 0; i < children.length; i++) { 
    $.ajax({
         url: DATA_SOURCE,
         dataType: "jsonp",
         success: (function (count) {
             return(function(data2){console.log(urls[0]); console.log(urls[count]);});        
         })(i)
    });                        
}

ここで、反復ごとに生成される成功関数は、異なる値をログに記録するという点で微妙に異なります。

于 2012-10-18T07:12:58.400 に答える