Ajax 在 forEach 循环中具有意外输出



为什么下面输出中的索引值不是所有 console.logs 的 3?我期望:

  1. forEach 循环调用 ajax 4 次,然后任何请求返回响应。 索引 = 3。
  2. 返回响应,运行成功回调,在执行阶段,检查范围链中的索引已经为 3。

我假设当索引不是 3 时,响应返回的速度不足以运行成功回调。

campaigns = [1, 2, 3, 4];
campaigns.forEach((campaign, index) => {
$.ajax({
type: 'GET',
url: apiURL,
success: function(data) {
console.log('index: ', index);
}
});
});

输出(每次异步不同(:

index: 2
index: 1
index: 3
index: 0

index是传递给回调的每个迭代的参数- 该参数不会自行更改。它不像for循环,每次迭代都可以更改共享i变量。

如果要模拟for (var i = 0...循环,其中i在结束时重新分配给3,则需要另一个外部变量,并在每次迭代时显式重新分配它,例如:

const campaigns = [1, 2, 3, 4];
let campaignIndex = 0;
campaigns.forEach((campaign, index) => {
campaignIndex = index;
$.ajax({
type: 'GET',
url: apiURL,
success: function(data) {
console.log('campaignIndex: ', campaignIndex);
}
});
});

因为,ajax 调用是异步的,而 forEach 是同步的。若要避免这种情况,请使用递归或使用新异步库来控制流。

  1. 新异步(每个,瀑布,每个系列(

最新更新