有没有办法将变量从beforeSend传递给jQuery .ajax函数中的成功函数?

Cal*_*hus 3 ajax jquery

问题

当使用AJAX查询远程API时,由于请求的异步特性,它在完成时都会返回。问题是,当我不得不使用不同的条件对相同的API进行迭代调用时,我不知道会返回哪个响应。

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

示例代码:(简体)

n=5;
for(i=0; i < n; i++) {
  $.ajax({
    url: someURL,
    method: post,
    // I don't want to have to use async: false, that's bad
    // async: false,
    data: JSON.stringify(someData),
    beforeSend: function(){
      console.log("Starting request #"+i)
    },
    error: function(err, code, text) {
      alert("Something went wrong: \n\n" + code + ": " + text);
    },
    success: function(response) {
      console.log("Response for request #"+i)
      console.log(response)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

问题在于最终的成功功能:我应该看到的是:

Starting request #0
Starting request #1
Starting request #2
Starting request #3
Starting request #4
Response for request #2
[object]
Response for request #1
[object]
Response for request #4
[object]
Response for request #0
[object]
Response for request #3
[object]
Run Code Online (Sandbox Code Playgroud)

我真正看到的是:

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]
Run Code Online (Sandbox Code Playgroud)

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

Don*_*rdy 5

如评论中所述,这是循环闭包中更常见的错误的特例。由于iwill 的值会随着时间的流逝而改变success,因此您将需要存储它(通过在发出ajax请求的循环之外调用帮助函数)或绑定i到成功函数。例:

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)
    });
}
Run Code Online (Sandbox Code Playgroud)