【发布时间】:2015-09-12 04:21:46
【问题描述】:
我用 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
【问题讨论】:
-
你必须把所有变量都放在
callAjax... 以使它们成为callAjax范围的本地变量 -
您对每个请求都使用相同的
jQueryCallbackRandom。如果任何一个请求花费的时间超过 5 秒,您就会开始遇到冲突。停止手动命名回调,这将停止发生。 -
@KevinB 见:stackoverflow.com/questions/32515179/…
-
不,不是,您在顶部设置一次,然后为每个请求重用它。
-
callParameters只初始化一次,因此在每次$.ajax()调用时它们将完全相同。如果你移动所有这些东西(除了@Haketo 建议的callAjax()函数内对setTimeout()的启动调用,那么它就不会出现这些故障。(它仍然会有超时错误,因为你已经设置了一个非常短的超时限制。)
标签: javascript jquery jsonp typeerror