在jQuery.ajax函数中,有没有一种方法可以将变量从beforeSend传递到success函数?

在jQuery.ajax函数中,有没有一种方法可以将变量从beforeSend传递到success函数?,jquery,ajax,Jquery,Ajax,问题 当使用AJAX查询远程API时,由于请求的异步性质,它会在完成时返回。问题是,当我必须用不同的标准对同一个API进行迭代调用时,我不知道会返回哪个响应 问题是:是否可以从中传递变量 示例代码:(简化) 我实际上看到的是: Starting request #0 Starting request #1 Starting request #2 Starting request #3 Starting request #4 Response for request #4 [object] Res

问题

当使用AJAX查询远程API时,由于请求的异步性质,它会在完成时返回。问题是,当我必须用不同的标准对同一个API进行迭代调用时,我不知道会返回哪个响应

问题是:是否可以从中传递变量

示例代码:(简化)

我实际上看到的是:

Starting request #0
Starting request #1
Starting request #2
Starting request #3
Starting request #4
Response for request #4
[object]
Response for request #4
[object]
Response for request #4
[object]
Response for request #4
[object]
Response for request #4
[object]

这一点很重要,不是因为我关心我的日志是否正确,而是因为实际版本需要能够使响应与发送的内容保持一致。我不想在这个问题上进行同步,因为它会很慢,很烦人,可能会超时。

如评论中所述,这是一个更常见的错误的特例。由于
i
的值在
success
运行时会发生变化,因此您需要存储它(通过在发出ajax请求的循环外调用一个帮助函数)或将
i
绑定到success函数。例如:

for (var i = 0; i < 5; i++) {
    $.ajax({
        url: '/url',
        success: function (i, response) {
            console.log("Response for request #"+i);
            console.log(response);
        }.bind(window, i)
    });
}
for(变量i=0;i<5;i++){
$.ajax({
url:“/url”,
成功:功能(i,响应){
console.log(“请求响应#”+i);
控制台日志(响应);
}.bind(窗口,i)
});
}

使用函数发出AJAX请求,并将
i
传递给该函数:

var n = 5;
for(i = 0; i < n; i++) {
  makeRequest(i);
}

function makeRequest(i) {
  $.ajax({
    url: url,
    method: 'POST',
    data: JSON.stringify(someData),
    beforeSend: function(){
      console.log("Starting request #"+i)
    },
    error: function(err, code, text) {
      console.log("Response for request #"+i)
      ...
    },
    success: function(response) {
      console.log("Response for request #"+i)
      ...
    }
  });
}
var n=5;
对于(i=0;i
搜索“javascript循环中的最后一个值”,您会发现重复项,如和(而且很可爱,甚至还有我以前的用户166390的评论!)的可能重复项(来自相关问题中的相关链接)。这非常有帮助,谢谢!这绝对解决了我的问题。进一步挖掘闭包也非常有用。
.bind(window,i)
在视觉上类似于
window.i=i。这就是它所做的吗?@kiradotee的-
上下文
/
窗口
将在函数运行时成为
,而
i
将作为函数的第一个参数预加载。所以
window
只是一个占位符,也可以使用
null
for (var i = 0; i < 5; i++) {
    $.ajax({
        url: '/url',
        success: function (i, response) {
            console.log("Response for request #"+i);
            console.log(response);
        }.bind(window, i)
    });
}
var n = 5;
for(i = 0; i < n; i++) {
  makeRequest(i);
}

function makeRequest(i) {
  $.ajax({
    url: url,
    method: 'POST',
    data: JSON.stringify(someData),
    beforeSend: function(){
      console.log("Starting request #"+i)
    },
    error: function(err, code, text) {
      console.log("Response for request #"+i)
      ...
    },
    success: function(response) {
      console.log("Response for request #"+i)
      ...
    }
  });
}