javascript - 不明白这个 setTimeout 如何/为什么解决我的 IE8 问题

标签 javascript asynchronous internet-explorer-8 queue settimeout

我有两个 jsbin 来说明代码:

http://jsbin.com/OdiSApI/1/edit 这将在 IE8 中触发警报 - 该警报位于调用函数 ExecuteSearch 中。

http://jsbin.com/OdiSApI/2/edit 这似乎在 IE8 中运行良好。

注意:您需要单击右上方 Pane 中的使用 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 的 XDomainRequest (XDR)(部分 CORS 支持)。在第一个 jsbin 中,我在 ExecuteSearch 函数中触发了警报,因为我的 GeoCode 函数在 xdr.onload 触发之前返回。

超时似乎正在排队我的异步 XDR,尽管我不太确定发生了什么以及为什么超时似乎是我的 Elixir 。

大家有什么想法吗?

最佳答案

setTimeout 无法解决问题。

实际发生的情况是,IE8 在 XDomainRequest 对象中存在一个错误,当打开待处理的请求时,该对象会受到垃圾回收的影响。

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

setTimeout 似乎有效的原因是它使 XDR 对象在范围内保持的时间稍长一些。它似乎有效,但实际上并没有解决问题 - 竞争条件仍然存在,如果垃圾收集器稍后运行,它仍然可以销毁 XDomainRequest 对象。

我在此处发布了有关各种 XDomainRequest 问题的一些详细信息以及解决方法:IE, XDomainRequest not always work

关于javascript - 不明白这个 setTimeout 如何/为什么解决我的 IE8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601879/

相关文章:

c# - 将 JavaScript 与 C# 结合使用用于非基于浏览器的操作

node.js - 在 catch 中使用 wait 的效果

java - 使用 RxJava 2 异步读取文件

html - 为什么 IE8 在 HTML 密码字段中显示问号而不是项目符号?

image - 为什么 IE8 不显示包含在 <h1> 和 <a> 标记中的 <img>?

javascript - 打开新选项卡/窗口并关闭旧选项卡/窗口

javascript - 从网页触发/调用 Chrome 扩展程序

javascript - AngularJs:添加动态行,防止重复

javascript - Backbone 集合提取不触发

javascript - 如何链接条件异步回调?