2

私がこれを持っているとしましょう:

for( i = 0; i < 10; i++ )
{
    $.ajax({
        type: "POST",
        url: "geocode-items.php",
        async: true,
        data: {  
            key: i
        },
        success: function( data )
        {
            // data returns the index I passed into the script with the data property.
        },
        error( a, b, c )
        {
            alert( i ); // this obviously won't work
        }
    });    
}

アラート(私); エラーセクションでは、正しいインデックスに警告しません。成功した場合は、geocode-items.php スクリプトに入力したキーを返すことができますが、エラー セクションでは何も返すことができません。

エラーメソッドを起動するときに、リクエストを通じて送信された元のデータを参照する方法を知っていますか?

this.data.keyのようなもの?スタックしている特定のオブジェクトのエラーを報告できますか? 一般的な「エラー コードがあったが、どこにあるかわからない」を記述する必要はありません。

4

4 に答える 4

1

JavaScript のスコープとクロージャーについて何かを読む必要があります。あなたの場合、各エラーコールバックの値iは同じであり、ajax は非同期であるiため、すべてのエラーコールバックが 10 です。

JavaScript には関数ベースのスコープのみがあり、ブロック ベースのスコープはありません。できることは、値を(function(param1) { } )(value)この関数に渡す匿名関数を作成することです。これはすぐに呼び出されます。次に、関数のパラメーターがその関数呼び出しにバインドされます。

for( i = 0; i < 10; i++ )
{
    (function(idx) {
       $.ajax({
           type: "POST",
           url: "geocode-items.php",
           async: true,
           data: {  
               key: idx
           },
           success: function( data )
           {
               // data returns the index I passed into the script with the data property.
           },
           error: function( a, b, c )
           {
               alert( idx ); // this obviously won't work
           }
        });
    })(i);   
}
于 2013-01-18T12:55:41.980 に答える
0
for (i = 0; i < 10; i++) {
    $.post("geocode-items.php", {key: i})
    .done(function (data) {
        // ...
    },
    .fail(function (i) {
        return function (a, b, c) {
            alert(i);
        };
    }(i));    
}

ポイントは、すべての Ajax コールバックが非同期で呼び出されることです。つまり、ループの実行が終了した後に呼び出されます。常にその場合になります。fori9

成功のコールバックの場合、サーバーの応答からその状態を認識します。それが何であるかを気にしないiので、それは機能します。

ただし、エラー コールバックには応答がありません。の値を維持するにはクロージャーが必要ですi


そうは言っても、実質的に同一の Ajax リクエストを for ループで処理することは、そもそも賢明なことではないかもしれません。それらを 1 つに結合し、値の配列 (JSON) を送信します。

于 2013-01-18T12:58:15.290 に答える
0

i変数として格納できます。

for( i = 0; i < 10; i++ )
{
    var index=i;
    $.ajax({
        type: "POST",
        url: "geocode-items.php",
        async: true,
        data: {  
            key: i
        },
        success: function( data )
        {
            // data returns the index I passed into the script with the data property.
        },
        error( a, b, c )
        {
            alert( index ); // this obviously won't work
        }
    });    
}
于 2013-01-18T12:57:27.813 に答える
0

jqXHR プロパティを使用してみてください

http://api.jquery.com/jQuery.ajax/#jqXHR

beforeSend イベントまたは ajaxSend() メソッドを使用して ajax 呼び出しを行う前に、jqXHR にインデックス プロパティ 'i' を配置します。

http://api.jquery.com/ajaxSend/

于 2013-01-18T12:59:21.743 に答える