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

时间:2018-08-23 02:53:30

标签: javascript

为什么对于所有console.logs,输出以下的index值都不是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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  1. neo-async (each, waterfall, eachSeries)