Var在异步回调中提供最新数据

时间:2018-03-12 09:22:07

标签: javascript asynchronous callback

使用异步回调时,Internet Explorer和Google Chrome之间存在不同的行为。对于此功能,我使用2017年的for循环从服务器加载数据直到当前年份。

我的代码是:

        for (var y = 2017; y <= crrntYr; y++) {
            cnt++;
            var rtrn = evalExpression(sssn, "call('rp/ajax/wkChrt','" + y + "')", function (data) {
                    console.log(y);
                });
        }

回调完成后,Internet Explorer中存在问题:  y == 2019 因此,对于每年检索数据时,for循环已经结束,y = 2019。

在谷歌浏览器中它的工作方式是有意的,当回调完成时,y是evalExpression()启动时的值,因此正在处理的是年份。

如何在回调函数中将y设置为正确的值?

编辑10:42:将功能简化为基础

2 个答案:

答案 0 :(得分:0)

我认为您应该使用let代替var。 看看这两个循环之间的区别:

for (var i = 0; i < 10; i++) {
  // Simulet async call...
  setTimeout(function(){
    console.log(i);
  }, 2000);
}

for (let i = 0; i < 10; i++) {
  // Simulet async call...
  setTimeout(function(){
    console.log(i);
  }, 2000);
}

第一个将在控制台中写入10次10​​次。 第二个将写1-10。

您可以在这篇文章中详细了解:

Asynchronous Process inside a javascript for loop

答案 1 :(得分:0)

在standby954链接的帖子中找到答案: 使用IIFE创建自己的功能关闭

        for (let y = 2017; y <= crrntYr; y++) {
            (function(yr) {
                cnt++;
                var rtrn = evalExpression(sssn, "call('rp/ajax/wkChrt','" + yr + "')", function (data) {
                    rCnt++;
                    console.log(yr);
                });
            })(y);
        }