2012-03-17 24 views
1

我刚刚注意到安装Firefox 11后,我在webapp上发现了一些奇怪的行为。我之前没有看到过这个错误,并且该站点已经运行了一年多。发送函数完成之前是否可以回调完成的XmlHttpRequest触发器?

var timeOutTimer = null; 

var StartDownload = function() { 
    xhr.open("GET", "/Download", true);   //Notice asynchronous=true 
    xhr.onreadystatechange = DownloadComplete; 
    xhr.send("..."); 

    timeOutTimer = new Timer(......); //This line gets executed AFTER DownloadComplete() 
}; 

var DownloadComplete = function() { 
    if (xhr.readyState == 4) { 
     timeOutTimer.Abort();   //<--------timeOutTimer is null here 
     //Callstack points back to xhr.send 
    } 
} 

如果真的有可能为XMLHttpRequest来甚至退出的send()之前调用onreadystatechange的回调 - 功能?

只有当我在本地开发服务器上浏览网站时才会出现此错误。另外,如果我添加1sec延迟serverside没有问题。我还没有尝试过任何其他浏览器。

我想解决方案是在发送之前启动定时器,但我只想知道这种行为背后的原因,以及它是否正确,因为我从来没有经历过它。

+0

您是否重新初始化现有的XHR对象,或者在每次调用StartDownload时创建一个新对象?你的代码中有没有'alert()'调用? – 2012-03-19 02:55:06

回答

1

你说甚至在退出send()函数之前“但这不是真的。你打电话给发送,然后你正在构造一个计时器,但事情发生得如此之快,以致你甚至在计时器进入其变量之前,就会发生回调。它是异步的,就像你所要求的一样。只需要为此做好准备。

+0

但JavaScript本身是单线程的。异步事件只能在用户代码不运行时触发。因此,StartDownload应该在任何异步事件触发前完成,并且上述行为的唯一方法是发送永不退出。 – user1248092 2012-03-17 20:33:37

+0

也许它取决于“跑步”的定义 - 显然你看到令人惊讶的事情,但FF11是全新的,所以谁知道。正如你所说,如果你移动定时器的构造函数,你将会很安全。仍然感到惊讶,但安全。 – dldnh 2012-03-17 20:44:01

相关问题