$.getjson 特定于 IE 的错误
$.getjson IE-specific error
通过使用 for-loop 向服务器请求几个数据库条目,我写了一段代码,效果很好,但是:
神奇的是,这段代码在 IE11 上不起作用。
对于 Google Chrome、Firefox、Safari、...,它工作得很好。但不幸的是我需要使用 IE11。该代码没有给出错误,但从服务器返回的数据不存在。只有 for 循环中的最后一个元素被传输。
通过IE Network connection representation工具,可以看到所有的请求都被发回了,但是不知为何只有最后一个已经在了。 Mabye 有人已经遇到了这个问题,可以给我一些提示...
function getData(setAddress_Event, liter_hour, Fluid_id, dateArray){
return $.getJSON(setAddress_Event + liter_hour + Fluid_id + "/" + dateArray).then(function(data){
return {
data_list:data
};
});
}
//get day2day data
var numPendingResults = dateArray.length;
//new var declaration --> "let" is only valid inside the for loop!!
for(let j = 0; j<dateArray.length; j++)
{
getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
//received data!
data_collection[j] = returndata;
numPendingResults--; // one less to wait for!
if (!numPendingResults) { // we have everything!
//console.log(data_collection);
//function call which sends the data forward
dataReady(data_collection, data_limit);
}
函数 dataReady 应该处理接收到的数据,但不知何故使用 IE11,只有来自循环的最后一个请求就在那里!因此,我决定提出一个新问题。或许有哪位天才可以给我一些提示...
在 IE11 中与规范不兼容。1 不幸的是,for
循环中的 let
在 IE9-IE11 中错误地实现(和 Edge up到并包括 Edge 13;Edge 14 终于做对了)。在兼容 ES2015(aka "ES6")规范的浏览器中,此代码应显示 1、2、3、4、5;但在 IE11 上,它显示 6、6、6、6、6(就像我们使用 var
时一样)。
for (let i = 1; i <= 5; ++i) {
setTimeout(function() {
console.log(i);
}, 0);
}
您有两个选择:
- 使用 dealing with closures in loops 的其他解决方案之一,而不是
let
解决方案。
- 使用
let
,但在循环内
这是 #2,它在 IE11 上可以正常工作:
for (let i = 1; i <= 5; ++i) {
let inner = i; // Different variable
setTimeout(function() {
console.log(inner);
}, 0);
}
1 最初我称它为 "bug," 但值得注意的是 IE11 在最终 ES2015 规范之前两年发布,[= 的确切语义12=] in 循环在规范过程中四处移动,所以可能只是微软跳枪实施了他们认为将基于当前对话的内容,只是在最终规范出来之前改变了它。这是在规范过程中过早实施的危险。 (同时,该过程本身已经更加正式化,以帮助供应商避免这种事情。)
通过使用 for-loop 向服务器请求几个数据库条目,我写了一段代码,效果很好,但是:
神奇的是,这段代码在 IE11 上不起作用。 对于 Google Chrome、Firefox、Safari、...,它工作得很好。但不幸的是我需要使用 IE11。该代码没有给出错误,但从服务器返回的数据不存在。只有 for 循环中的最后一个元素被传输。
通过IE Network connection representation工具,可以看到所有的请求都被发回了,但是不知为何只有最后一个已经在了。 Mabye 有人已经遇到了这个问题,可以给我一些提示...
function getData(setAddress_Event, liter_hour, Fluid_id, dateArray){
return $.getJSON(setAddress_Event + liter_hour + Fluid_id + "/" + dateArray).then(function(data){
return {
data_list:data
};
});
}
//get day2day data
var numPendingResults = dateArray.length;
//new var declaration --> "let" is only valid inside the for loop!!
for(let j = 0; j<dateArray.length; j++)
{
getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
//received data!
data_collection[j] = returndata;
numPendingResults--; // one less to wait for!
if (!numPendingResults) { // we have everything!
//console.log(data_collection);
//function call which sends the data forward
dataReady(data_collection, data_limit);
}
函数 dataReady 应该处理接收到的数据,但不知何故使用 IE11,只有来自循环的最后一个请求就在那里!因此,我决定提出一个新问题。或许有哪位天才可以给我一些提示...
在 IE11 中与规范不兼容。1 不幸的是,for
循环中的 let
在 IE9-IE11 中错误地实现(和 Edge up到并包括 Edge 13;Edge 14 终于做对了)。在兼容 ES2015(aka "ES6")规范的浏览器中,此代码应显示 1、2、3、4、5;但在 IE11 上,它显示 6、6、6、6、6(就像我们使用 var
时一样)。
for (let i = 1; i <= 5; ++i) {
setTimeout(function() {
console.log(i);
}, 0);
}
您有两个选择:
- 使用 dealing with closures in loops 的其他解决方案之一,而不是
let
解决方案。 - 使用
let
,但在循环内
这是 #2,它在 IE11 上可以正常工作:
for (let i = 1; i <= 5; ++i) {
let inner = i; // Different variable
setTimeout(function() {
console.log(inner);
}, 0);
}
1 最初我称它为 "bug," 但值得注意的是 IE11 在最终 ES2015 规范之前两年发布,[= 的确切语义12=] in 循环在规范过程中四处移动,所以可能只是微软跳枪实施了他们认为将基于当前对话的内容,只是在最终规范出来之前改变了它。这是在规范过程中过早实施的危险。 (同时,该过程本身已经更加正式化,以帮助供应商避免这种事情。)