修复了Ajax调用的IE 12030重复性错误

时间:2011-11-15 01:31:25

标签: javascript ajax internet-explorer

我只是循环我的Ajax调用,直到12030错误消失。错误报告为错误here

有没有人知道是否有更好的修复...因为这需要时间来循环。我读到这是IE的一个已知问题,它间歇性地产生12030错误作为Ajax状态。

var Ajax = {
    createAjaxObject: function()
    {
        var request;
        try
        {
            request = new XMLHttpRequest();
        }
        catch(error)
        {
            try 
            {
                request = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch(error)
            {
                try
                {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(error)
                {
                    request = false;
                }
            }
        }
        return request;
    },

    useAjaxObject: function( path, param, ajax_func, html_div )
    {
        var object = new Ajax.createAjaxObject();
        object.open( "POST", path, true );
        object.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
        object.setRequestHeader( "Content-length", param.length );
        object.setRequestHeader( "Connection", "close" );
        object.onreadystatechange = function()
        {
            if( this.readyState === 4 )
            {
                if( this.status === 200 )
                {
                    ajax_func( this.responseText, html_div );
                }
                else
                {
                    Ajax.repeatUseAjaxObject( path, param, ajax_func, html_div );
                    return false;
                }
            }
        };
        object.send( param );
        return true;
    },
    repeatUseAjaxObject: function( path, param, ajax_func, html_div )
    {
        var state = false,
            count = 1;
        while(state === false && count <= 5)
        {
            state = Ajax.useAjaxObject( path, param, ajax_func, html_div );
            if( count !== 1 )
            {
                alert( 'Ajax Object Use Failed ');
            }
        count++;
        }
        return state;
    }

3 个答案:

答案 0 :(得分:3)

我遇到同样的问题,只要AJAX请求是异步的,我找到了一个适合我的解决方案。

解决方案是将AJAX调用包含在setTimeout调用中,延迟为0。

这对我来说似乎100%有效。

我还与我的一位同事核实,12030错误仍然出现在Internet Explorer 9中。

<rant>So Billy G and company see fit to provide us with the new "Metro" interface, but they can't be bothered to fix their browser that all web programmers must support</rant>

答案 1 :(得分:1)

这是Internet Explorer中XMLHttpRequest底层套接字处理的文档错误。

当您使用XMLHttpRequest对象从服务器读取响应时,服务器必须首先清除读取缓冲区。 (即使它对它不感兴趣)。

确保服务器端代码在发送响应之前读取整个请求字节。

如果您指定了您正在使用的服务器技术,我可能会举例说明。

答案 2 :(得分:1)

你说你正在循环,但是为你的重试设置一个超时而不是循环将是避免用户感知延迟的好方法(除非你真的打算在你得到答案之前阻止其他JavaScript执行!这不会阻止错误,但它只是客户端减轻对浏览器影响的唯一方法。 (我假设您的评论“因为这需要时间来循环”浏览器滞后。这是您真正的问题。)

实际上,我可能太过于字面意思了...现在我想到它实际循环也会禁止后续请求。你能更具体地了解你的“循环”技术吗?你的意思是“占用时间”?