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));
}