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

您可以存储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
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.


话虽如此,在 for 循环中拥有几乎相同的 Ajax 请求可能并不是最聪明的事情。将它们合二为一,发送一组值 (JSON)。

于 2013-01-18T12:58:15.290 回答
0

尝试使用 jqXHR 属性

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

在使用 beforeSend 事件或 ajaxSend() 方法进行 ajax 调用之前,将索引属性“i”放入 jqXHR

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

于 2013-01-18T12:59:21.743 回答