Javascript 不理解setTimeout如何/为什么解决我的IE8问题

Javascript 不理解setTimeout如何/为什么解决我的IE8问题,javascript,asynchronous,internet-explorer-8,queue,settimeout,Javascript,Asynchronous,Internet Explorer 8,Queue,Settimeout,我有两个jsbin来说明代码: 这将触发IE8中的警报-此警报位于调用函数ExecuteSearch中 这在IE8中似乎运行良好 注意:您需要单击右上窗格中的运行JS按钮。然后在文本字段中输入一个处于下拉状态的城市并提交表单(这称为谷歌地图地理代码API) 第二个链接中的“修复”如下所示: //account for asynchronous nature of IE XDR request //geo_location is undefined here in IE8 //this see

我有两个jsbin来说明代码:

这将触发IE8中的警报-此警报位于调用函数ExecuteSearch中

这在IE8中似乎运行良好

注意:您需要单击右上窗格中的运行JS按钮。然后在文本字段中输入一个处于下拉状态的城市并提交表单(这称为谷歌地图地理代码API)

第二个链接中的“修复”如下所示:

//account for asynchronous nature of IE XDR request
//geo_location is undefined here in IE8
//this seems to fix ie8, though I'm not sure why...
var timeout = setTimeout(function() {
    clearTimeout(timeout);
}, 10);
我遇到的问题是,我必须为IE8-9(部分CORS支持)使用XDomainRequest(XDR)。在第一个jsbin中,我在ExecuteSearch函数中触发警报,因为我的地理代码函数在我的xdr.onload启动之前返回

超时似乎在排队等待我的异步XDR,尽管我不确定发生了什么,也不知道为什么超时似乎是我的灵丹妙药


有人有什么想法吗?

setTimeout没有解决这个问题

实际发生的是,IE8在XDomainRequest对象中有一个bug,当挂起的请求打开时,它会被垃圾收集

如果查看原始源代码,“xdr”变量在调用send()后立即超出范围。这不应该是一个bug,但是IE8注意到这个变量现在从未从任何地方被引用过。如果您运气不好,垃圾收集器将在send()异步完成并将对象从您下方核出之前运行

setTimeout似乎起作用的原因是它将XDR对象保持在作用域中的时间稍长。它似乎可以工作,但实际上并不能解决问题-争用条件仍然存在,如果垃圾收集器稍后运行,它仍然可以销毁XDomainRequest对象


我在这里发布了一些关于各种XDomainRequest问题的详细信息,以及解决方法:

setTimeout没有解决这个问题

实际发生的是,IE8在XDomainRequest对象中有一个bug,当挂起的请求打开时,它会被垃圾收集

如果查看原始源代码,“xdr”变量在调用send()后立即超出范围。这不应该是一个bug,但是IE8注意到这个变量现在从未从任何地方被引用过。如果您运气不好,垃圾收集器将在send()异步完成并将对象从您下方核出之前运行

setTimeout似乎起作用的原因是它将XDR对象保持在作用域中的时间稍长。它似乎可以工作,但实际上并不能解决问题-争用条件仍然存在,如果垃圾收集器稍后运行,它仍然可以销毁XDomainRequest对象


我在这里发布了一些关于各种XDomainRequest问题的详细信息,以及解决方法:

看起来似乎没有使用异步编程。任何这种粗鄙的黑客行为都不能解决根本问题,而且如果他们做了什么的话,会因浏览器而异。在XDR回调之前(根据程序执行时间线),您不能“返回地理位置”!我建议只返回一个Promise/a($.ajax返回一个,XDR for IE可以包装),然后正确地使用异步(即回调)编程。请注意,
XDR.send
仅在数据“发送”时保证同步,而不是返回数据(即只有在收到完整响应后才会调用onload)。因此,与我之前的评论一样:我推荐Promissions/A并继续使用异步模型(因此也要从普通AJAX中删除
async:false
)。setTimeout正在增加open()和send()之间的时间量。由于XDR对象被捕获到setTimeout闭包中,因此它在垃圾收集器中的安全保护时间更长。如果建立HTTP连接需要一段时间,send()将需要更长的时间,因为它需要等待open()异步完成。执行send()时,XDR已超出范围,可以进行垃圾收集。setTimeout使XDR对象保持更长的时间,使得open()更有可能在send()之前完成。看起来似乎没有使用异步编程。任何这种粗鄙的黑客行为都不能解决根本问题,而且如果他们做了什么的话,会因浏览器而异。在XDR回调之前(根据程序执行时间线),您不能“返回地理位置”!我建议只返回一个Promise/a($.ajax返回一个,XDR for IE可以包装),然后正确地使用异步(即回调)编程。请注意,
XDR.send
仅在数据“发送”时保证同步,而不是返回数据(即只有在收到完整响应后才会调用onload)。因此,与我之前的评论一样:我推荐Promissions/A并继续使用异步模型(因此也要从普通AJAX中删除
async:false
)。setTimeout正在增加open()和send()之间的时间量。由于XDR对象被捕获到setTimeout闭包中,因此它在垃圾收集器中的安全保护时间更长。如果建立HTTP连接需要一段时间,send()将需要更长的时间,因为它需要等待open()异步完成。执行send()时,XDR已超出范围,可以进行垃圾收集。setTimeout使XDR对象保持更长的时间,使得open()更有可能在send()之前完成。