所以有时候由于某种服务器异步性问题,或者某种东西......我不知道是什么,但它只是偶尔发生一次(s_mcir_2调用自己的跨域的AJAX函数,所以另一个我认为服务器可能不可靠)..无论如何,每隔一段时间结果从s_mcir_2返回为null而不是JSON对象。
当发生这种情况时,我想测试它是否为空,然后如果是,则让$ .when语句重新发送..理论上直到它收到有效输出。
有什么想法吗?
$.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
//EVALUATE "result"
});
答案 0 :(得分:1)
延迟对象只能解析一次。
尝试使用在失败时调用自身的命名函数。
function myFn () {
$.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
//EVALUATE "result"
if (!result) {
setTimeout(myFn,125);
log("R_MCIR_2 has failed");
}
else {
// success, do stuff
...
}
});
}
答案 1 :(得分:1)
.then()
可以使用两个回调函数,一个用于done
,另一个用于fail
。如果在函数内部运行代码,则可以递归地重新运行AJAX请求(请注意,这可能会产生无限循环):
var failedCount = 0;
function some_func() {
$.when(s_mcir_2(alt, data[l_alt])).then(
//done callback
function(result) {
//EVALUATE "result"
},
//fail callback
function () {
failedCount++;
if (failedCount < 10) {
//try again
some_func();
}
});
}
.then()
的文档:http://api.jquery.com/deferred.then
此代码假定s_mcir_2()
函数返回jqXJR对象(例如return $.ajax(...)
)。
注意我在失败的函数中添加了一个计数器,因此这个过程不会无限延续。一旦发出10个请求,递归就会停止。
<强>更新强>
如果不是jqXHR
对象被拒绝,如果它被解析为success
,你可以检查服务器响应,如果它是空的(例如typeof(serverResponse) == 'null'
),那么重新运行some_func()
功能。
答案 2 :(得分:0)
function attempt(){
$.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
//EVALUATE "result"
}).fail(function(result) {
log("R_MCIR_2 has failed");
setTimeout(attempt,500)
});
}