Javascript JSException仍然能够潜入,但很少,不知道为什么

Javascript JSException仍然能够潜入,但很少,不知道为什么,javascript,jquery,jsonp,typeerror,Javascript,Jquery,Jsonp,Typeerror,我用setTimeout包装了函数,它将永远运行。如果你在截图上注意到,js异常发生了很多次。这也是我们真正的应用程序正在发生的事情。我不知道为什么 这是小提琴: 以下是错误的屏幕截图:这是失败的,因为您的超时时间太短。当请求超时时,回调将从窗口中删除,然后当请求实际完成时,将引发异常,因为回调不在窗口中。这并不是每次都会发生,因为您对每个请求都使用相同的回调名称,有时它恰好在另一个请求尚未超时时完成,从而导致“成功”,但实际上并不成功 您的代码实际上非常接近,问题的根源在于您没有为每个请求提

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

这是小提琴:


以下是错误的屏幕截图:

这是失败的,因为您的超时时间太短。当请求超时时,回调将从窗口中删除,然后当请求实际完成时,将引发异常,因为回调不在窗口中。这并不是每次都会发生,因为您对每个请求都使用相同的回调名称,有时它恰好在另一个请求尚未超时时完成,从而导致“成功”,但实际上并不成功


您的代码实际上非常接近,问题的根源在于您没有为每个请求提供唯一的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);
}

您必须将所有变量放入
callAjax
。。。要使它们在
callAjax
scope中本地运行,您对每个请求都使用相同的
jQueryCallbackRandom
。如果任何一个请求花费的时间超过5秒,您将开始遇到冲突。停止手动命名回调,这将停止发生。@KevinB请参阅:不是,您在顶部设置了一次,然后在每个请求中重新使用它。
callParameters
只初始化一次,因此它们在每次调用
$.ajax()
时将完全相同。如果您按照@Hacketo的建议移动所有这些内容(除了
callAjax()
函数中对
setTimeout()
的启动调用),那么它将不会出现这些故障。(它仍然会有超时错误,因为您设置了非常短的超时限制。)这个poc的目标是捕获未捕获的TypeError。在我们的产品中,我们的超时是60秒,但它仍然很少发生。如果超时发生,错误总是会发生,因为这是JSONP。这是不可避免的。如果回调不再可执行,则会发生TypeError。这根本不是错误,只是waJSONP本身就是一种黑客行为,它不是浏览器支持的官方协议,相反,它是一种聪明的解决方法,通过使用允许跨源的标记,允许跨源传输信息,而不存在xhr的陷阱。我必须实际查看代码。如果它与问题中的相同,那么它肯定是正确的它可能不是唯一的。如果我要添加一个自动重试功能,我会这样做,即每个请求都可以打开和关闭它。然后您可以对它进行筛选,以不影响jsonp请求,并解决问题。
// 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);
}