JS异常仍然能够潜入但很少,不知道为什么
JS exception is still able to sneak in but very rarely, not sure why
我用 setTimeout 封装了函数,它将永远 运行。如果您在屏幕截图上注意到,js 异常发生了很多次。这也是我们真正的应用程序正在发生的事情。我不知道为什么。
这是fiddle: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)
}
这是失败的,因为你的超时时间太短了。当请求超时时,回调从 window 中删除,然后当请求实际完成时,抛出异常,因为回调不在 window 上。它不会每次都发生,因为您为每个请求使用相同的回调名称,有时它恰好完成,而另一个请求尚未超时但导致 "success" 实际上不是成功了。
您的代码实际上非常接近,问题的根源在于您没有为每个请求提供唯一的 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);
}
我用 setTimeout 封装了函数,它将永远 运行。如果您在屏幕截图上注意到,js 异常发生了很多次。这也是我们真正的应用程序正在发生的事情。我不知道为什么。
这是fiddle: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)
}
这是失败的,因为你的超时时间太短了。当请求超时时,回调从 window 中删除,然后当请求实际完成时,抛出异常,因为回调不在 window 上。它不会每次都发生,因为您为每个请求使用相同的回调名称,有时它恰好完成,而另一个请求尚未超时但导致 "success" 实际上不是成功了。
您的代码实际上非常接近,问题的根源在于您没有为每个请求提供唯一的 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);
}