1

3 つの値 (異なるレポート番号) の配列を反復処理し、それぞれに対して AJAX 要求を送信する for ループがあります。返されるレポートごとに .done() 関数が異なる動作をするようにします。ただし、完了関数でレポート番号を使用できるようにする方法がわかりません。レポート番号を done() 関数の引数として渡さないと、常にレポート番号が配列の最後の値である '190' であると見なされます。以下のように渡すと、未定義として表示されます。

function runQueries(request, data) {
    var reports = ['103', '187', '190'];
    for (i=0; i < reports.length; i++) {
        var report = reports[i];
        $.ajax({
        url: request + '&reportType=' + report},
        data: data
        })
        .done(function(response, textStatus, jqXHR, report) {
            if (report === '187') {
            ...
            }
            else if (report === '190'( {
            ...
            }
4

2 に答える 2

1

問題は、reportリクエストが完了するよりも速く変化することです。クロージャーでそれを避けることができます。これは順番に発生するわけではないことに注意してください。

var reports = [ 1, 2, 3 ];

for( var i = 0; i < reports.length; i++ ){
    var report = reports[i];
    console.log(report);
    (function(report){
        $.ajax({
            url: '/echo/html',
        }).done(function(){
            switch( report ){
                case 3: console.log('Three!'); break;
                case 2: console.log('Two!'); break; 
                case 1: console.log('One!'); break;
            }
        });
    })(report);
}

ここにフィドルがあります:http://jsfiddle.net/2ArxZ/

ループ内で関数を作成したくない場合は、これを使用してループ内で呼び出すことができます。

function getReport( report ){
  return function(){
    $.ajax({
        url: '/echo/html',
    }).done(function(){
        switch( report ){
            case 3: console.log('Three!'); break;
            case 2: console.log('Two!'); break; 
            case 1: console.log('One!'); break;
        }
    })();
  }
}

代わりに単純に使用することもできますが$.each、クロージャーを理解することは大いに役立つので、私は長い道のりを歩んできました!

于 2013-09-08T19:57:09.200 に答える
0

クロージャーとスコープ:

function runQueries(request, data) {
    var reports = ['103', '187', '190'];
    for (i=0; i < reports.length; i++) {
        (function(report) {
            $.ajax({
                url: request + '&reportType=' + report},
                data: data
            }).done(function(response) {
                if (report === '187') {
                      ...
                } else if (report === '190'( {
                      ...
                }
            });
         })(reports[i]);
    }
}

メソッドは非同期であるため、done()起動するまでに、ループはかなり前に完了しています。

$.each繰り返しを行うために使用することもできます。

于 2013-09-08T19:52:16.577 に答える