JS异常仍然能够潜入但很少,不知道为什么

时间:2015-09-11 20:07:00

标签: javascript jquery jsonp uncaught-typeerror

我用setTimeout包装了这个函数,它将永远运行。如果您在屏幕截图上注意到,那么多次发生了js异常。这就是我们真正的应用程序上发生的事情。我不知道为什么。

这是小提琴:http://jsfiddle.net/ux12xoya/1/

    // JSON Request
    var auxTime = new Date();
    var jQueryCallbackRandom = auxTime.getTime();

    var callParameters = {
        url: 'http://jsfiddle.net/echo/jsonp/',
        timeout: 2,
        dataType: "jsonp",
        data: { echo: "Hello World!" },
        jsonpCallback: "jQueryRandom_" + jQueryCallbackRandom,
        success: function(){
         console.log("success");   
        },
        error: function(jqXHR, textStatus){
            console.log("failed with error: " + textStatus);
            window["jQueryRandom_" + jQueryCallbackRandom] = function() {
              window["jQueryRandom_" + jQueryCallbackRandom] = null;
            };
        }       
    };

    var timeout = setTimeout(callAjax, 5000)

    function callAjax() {
        $.ajax(callParameters);
        clearTimeout(timeout);
        timeout = setTimeout(callAjax, 5000)
    }

以下是错误的屏幕截图:http://i.imgur.com/IFiW9ij.png

1 个答案:

答案 0 :(得分:2)

这是失败的,因为你的超时太短了。当请求超时时,回调将从窗口中删除,然后当请求实际完成时,抛出异常,因为窗口上的回调不是。每次都不会发生这种情况,因为您为每个请求使用了相同的回调名称,有时它恰好在另一个请求没有超时的情况下完成,但却导致了一个"成功"这实际上并没有成功。

您的代码实际上非常接近,问题的根源在于您没有为每个请求提供唯一的JSONPCallback。您只需将这些变量移动到ajax函数中,以便为每个请求重新创建它们,从而使每个变量都获得它自己的基于auxTime的回调名称。

// JSON Request
var timeout = setTimeout(callAjax, 5000)

function callAjax() {
    var auxTime = new Date();
    var jQueryCallbackRandom = auxTime.getTime();

    var callParameters = {
        url: 'http://jsfiddle.net/echo/jsonp/',
        timeout: 5,
        dataType: "jsonp",
        data: { echo: "Hello World!" },
        jsonpCallback: "jQueryRandom_" + jQueryCallbackRandom,
        success: function(){
         console.log("success");   
        },
        error: function(jqXHR, textStatus){
            console.log("failed with error: " + textStatus);
            window["jQueryRandom_" + jQueryCallbackRandom] = function() {
              window["jQueryRandom_" + jQueryCallbackRandom] = null;
            };
        }       
    };
    $.ajax(callParameters);
    clearTimeout(timeout);
}

http://jsfiddle.net/ux12xoya/2/