Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery错误和正确的循环索引_Jquery_Ajax - Fatal编程技术网

Jquery错误和正确的循环索引

Jquery错误和正确的循环索引,jquery,ajax,Jquery,Ajax,假设我有这个: for( i = 0; i < 10; i++ ) { $.ajax({ type: "POST", url: "geocode-items.php", async: true, data: { key: i }, success: function( data ) { // data returns t

假设我有这个:

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
        }
    });    
}
(i=0;i<10;i++)的

{
$.ajax({
类型:“POST”,
url:“geocode items.php”,
async:true,
数据:{
关键:我
},
成功:功能(数据)
{
//data返回我用data属性传递到脚本中的索引。
},
错误(a、b、c)
{
警惕(我);//这显然行不通
}
});    
}
警报(一);在“错误”部分中,将不会警告正确的索引。在成功中,我可以将输入的密钥传递回geocode-items.php脚本,但在错误部分,我不能传递任何内容

您知道在触发错误方法时如何引用通过请求发送的原始数据吗


像这样的。数据。钥匙?这样我就可以报告我被卡住的特定对象的错误了?与其写一些通用的“有一个错误代码,但我不知道在哪里”

你应该读一些关于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);   
}
(i=0;i<10;i++)的

{
(功能(idx){
$.ajax({
类型:“POST”,
url:“geocode items.php”,
async:true,
数据:{
关键字:idx
},
成功:功能(数据)
{
//data返回我用data属性传递到脚本中的索引。
},
错误:函数(a、b、c)
{
警报(idx);//这显然行不通
}
});
})(i) );
}

您可以将
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
        }
    });    
}
(i=0;i<10;i++)的

{
var指数=i;
$.ajax({
类型:“POST”,
url:“geocode items.php”,
async:true,
数据:{
关键:我
},
成功:功能(数据)
{
//data返回我用data属性传递到脚本中的索引。
},
错误(a、b、c)
{
警报(索引);//这显然行不通
}
});    
}
用于(i=0;i<10;i++){
$.post(“geocode items.php”,{key:i})
.完成(功能(数据){
// ...
},
.失败(功能(i){
返回函数(a、b、c){
警报(一);
};
}(i) );
}
关键是所有Ajax回调都是异步调用的,也就是说,它们是在
for
循环完成运行后调用的。
i
在这种情况下总是
9

在成功回调的情况下,它从服务器的响应中知道它的状态。它不关心
i
是什么,因此它可以工作

但是,错误回调没有响应。它需要一个闭包来维护
i
的值



话虽如此,在for循环中使用几乎相同的Ajax请求可能不是最明智的做法。将它们组合成一个,发送一个值数组(JSON)。

尝试使用jqXHR属性

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


< P> < /P>为什么不使用10个项目中的数据来做1个Ajax请求,然后剖析返回值,而不是开机10个请求,这可能会在短时间内阻塞浏览器?AGECONTAL限制为谷歌API。不相关。但是谢谢:让我试试这个DRP: D BRBI现在意识到这就像一个C++函数指针,尽管如此,请继续解释,看看它是如何工作的非常有帮助。。另外,它确实有效。我会在可能的时候标记你的答案!非常感谢!所发生的事情是,您正在创建一个函数,同时将“i”作为参数传入。此函数现在将任何子函数作用域赋予“i”,因为变量i将作为新变量复制到函数中,而不是作为指向原始函数作用域中声明的原始变量的指针引用。这听起来对吗?这是行不通的,因为javascript没有基于块的作用域,只有基于函数的作用域。谷歌地图要求每秒调用10个地理编码结果,每个请求都必须是异步的,这样在尝试获取地理编码结果时,它就不会阻塞我的应用程序。现在听起来好多了?谢谢顺便说一句:)@James我没有说任何反对异步的话-这是在JS中执行HTTP请求的唯一方法。如果您只是在寻找同步10个请求的方法,那么有一种比保留
i
变量更好的方法。如果你想知道怎么做,告诉我。哦,当然可以。所以目前,我有大量数据需要在谷歌地图中进行地理编码。我为需要进行地理编码的10位数据启动一个循环,我将10位数据发送到运行服务器端地理编码脚本的PHP中,并返回该数据的结果。。。当这种情况发生时,我在第一次呼叫后等待了一秒钟,然后发送了另外10位数据进行地理编码。这是因为谷歌地图api每秒只允许10个地理代码。我使用异步代码(ajax)来避免使用地理编码的PHP代码,并允许加载条。关于如何改进这一点,有什么想法吗?它目前运行得非常好!但是如果你能想出一个更干净的方法,我肯定会修改我的代码:如果它工作得很好,就不要修改它。我正要建议处理您的多个并发请求,但经过再三考虑,这对您的sit可能并没有多大好处
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));    
}