使用异步回调时,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:将功能简化为基础
答案 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。
您可以在这篇文章中详细了解:
答案 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);
}