jQuery Ajax调用导致Internet Explorer崩溃?

4

我必须承认,这是我在本网站上的第一篇文章,如果我做错了什么(格式等),请提前谅解。

无论如何,我正在使用JavaScript(和jQuery)创建一种类似MMO的东西,目前在Chrome、Safari、Firefox等浏览器中一切运行正常。然而,我发现在某个地方,Internet Explorer会崩溃。

通过重现崩溃,我将其缩小到以下代码:

function getUpdates(){
var data={uid:playerName,area:1,mid:lastMessage};
$.ajax({ 
    url: "getUpdates.py", 
    timeout: 32000,
    data: data,
    type:"GET",
    complete: function(obj, textStatus){
            //handleUpdates(obj);
        getUpdates();
        }
    });
}

这段代码本来是用来长时间轮询更新的。然而,在IE浏览器中,当有一次回复后,该代码会陷入无限循环,导致浏览器崩溃。它似乎并不是每次回复都会崩溃,只有在没有服务器响应时才会。

请注意,“complete:…”这一行已尝试过以下方法:

success: function(...){getUpdates();...},
error: function(...){getUpdates();...}

出现相同问题。


1
看起来你做得很好...恭喜!但是,你应该添加 javascript 和/或 ajax 标签,而不是 long-polling - SLaks
为什么不在再次调用getUpdates()之前设置超时时间呢? - James Black
服务器在响应请求时需要很长时间(因此有32秒的超时限制)。有些请求可能需要30秒才能生成回复。游戏是实时的,因此在获取之间添加额外的客户端延迟非常明显,并且不会节省太多带宽。 - Sylvan
1个回答

12

IE会从缓存中立即返回AJAX调用结果。

你应该向URL添加一个随机参数,以强制IE忽略其缓存,像这样:


url: "getUpdates.py?RandomNumber=" + Math.random(), 

(您也可以使用new Date


另外,您应该通过添加5秒延迟来稍微缓慢地检查更新:

complete: function(obj, textStatus){
        //handleUpdates(obj);
    setTimeout(function() { getUpdates(); }, 5000);   //milliseconds
}

1
+1 - 我没有考虑到它被缓存了,因此关闭缓存可能会解决这个问题。我只是假设ajax调用时缓存已关闭,这是错误的假设。 - James Black
1
谢谢,我尝试了这个方法,它非常好用!我以前没意识到浏览器会缓存 AJAX 调用,谢谢提醒。 - Sylvan
1
你应该能够在ajax函数中添加设置cache: false,它将为您的URL添加一个随机(时间戳)参数。 - andyface
1
相关:https://dev59.com/AW855IYBdhLWcg3wg0nC - StvnW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接