0

私は次のコードを反復処理する方法を理解しようとしています。

var arr = []

$ .ajax({

 type: 'POST',
   dataType: 'html', 
   url:   '/test/public/index/getid', 
   success: function(response) {
        response = $.parseJSON(response)
        $.each(response, function(index, value) {
             arr.push(value)

        });
   }

});

console.log(arr)

$ .each(arr、function(index0、value0){

console.log('INDEX0:' + value0);

});

これにより、拡張可能なファイアバグの[]が表示されます。次に0と1があり、IDが表示されます

[]

01234343

1 2343223

2 414234

3 232342

しかし、後でプログラムで$ .eachを使用してループしようとすると、読み取れません。

console.logを介して印刷すると、このようになります。

["1234343"、 "2343223"、 "414234"、 "232342"]

内部の値は、その最初のループでプッシュされるIDです。

これを行う方法について何かアイデアはありますか?arr.lengthを取得し、それをテスト条件として使用しようとしています。

RAW JSON応答:["1234343"、 "2343223"、 "414234"、 "232342"]

4

2 に答える 2

2

Ajaxは非同期であり、成功コールバックの外部でajaxリクエストからのデータにアクセスしようとしないでください。

$.ajax({
   type: 'POST',
   dataType: 'json', 
   url: '/test/public/index/getid', 
   success: function(arr) {
       console.log(arr);
   }
});

この方法でも実行できます。

var request = $.ajax({
    type: 'POST',
    dataType: 'json', 
    url: '/test/public/index/getid'
});
request.done(function(arr){
    console.log(arr);
});

2番目の方法では、次のようにするrequestだけで、必要な場所に移動して使用できます。

request.done(function(arr){
    // do something with arr
    console.log(arr)
});

コメントの更新、

リクエスト2がリクエスト1に依存している場合は、次の構造を使用します。

var request1 = $.ajax({...});

request1.done(function(){
    var request2  = $.ajax({...});
    request2.done(function(){
        // both are done, do stuff
    });
});

または、リクエスト1と2を送信し、両方が完了したときに何かを実行する場合は、次のように実行できます。

var request1 = $.ajax({...});
var request2 = $.ajax({...});
$.when(request1,request2).done(function(req1,req2) {
    // do stuff
});
于 2013-01-17T19:31:40.623 に答える
1
var arr = []

var callback = function(arr){
       console.log(arr);
};

$.ajax({

 type: 'POST',
   dataType: 'html', 
   url:   '/test/public/index/getid', 
   success: function(response) {
        response = $.parseJSON(response)
        $.each(response, function(index, value) {
             arr.push(value)

        });
        callback(arr);
   }
});

このようなことをしてみませんか?

あなたはメインプログラムの実行です。

  • 配列を定義しました
  • 次に、ajax呼び出しを行います
  • 次に、arrをログに記録します。

2番目のステップは非同期プロセスです。メインプログラムの実行はajax呼び出しに対して停止せず、ajax呼び出しが完了したかどうかに関係なく、実行を続行して完了します。そのため、console.log(arr)実行されるまでに、ajax呼び出しが返される場合と戻らない場合がありarr、コンソールにログを記録するための空の変数が残ります。空の配列がログに記録されるため、これがおそらく何も表示されない理由です。

arrコールバック関数を使用すると、ajax呼び出しが返され、にデータが入力された場合にのみ、コンソールに確実にログインできますarr

于 2013-01-17T19:29:30.277 に答える