我有一些JavaScript:
surveyBusy.show();
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
surveyBusy.hide();
})
.fail(function (jqXHR, textStatus, err) {
...
surveyBusy.hide();
});
但是,我只想发布 surveyBusy.show();
如果 $.getJSON
需要更多 n
毫秒数。否则你会闪烁。是否有回调 getJSON
能做到这一点的api?我懂了 文档中没有任何内容。
只需使用超时。另外,我把你的“隐藏”代码放在了 always
处理程序,以减少代码重复。
var busyTimeout = setTimeout(function() { surveyBusy.show(); }, 2000);
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
})
.fail(function (jqXHR, textStatus, err) {
...
})
.always(function() {
clearTimeout(busyTimeout);
surveyBusy.hide();
});
把你的 surveyBusy.show()
在超时内调用,然后取消该超时(使用 window.clearTimeout)如果在激活之前返回结果:
var busyTimeout = window.setTimeout(function() { surveyBusy.show(); }, 500);
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
})
.fail(function (jqXHR, textStatus, err) {
...
})
.always(function() {
window.clearTimeout(busyTimeout);
surveyBusy.hide();
});
使用 setTimeout
:
var busy = window.setTimeout(function(){
surveyBusy.show();
}, 1000);
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
// ...
window.clearTimeout(busy);
surveyBusy.hide();
})
.fail(function (jqXHR, textStatus, err) {
// ...
window.clearTimeout(busy);
surveyBusy.hide();
});
尝试此设置超时,然后在服务器响应时取消它:
// NOT TESTED
var n = 5000 // milliseconds
var tmr = setTimeout(function(){
surveyBusy.show();
}, n);
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
clearTimeout(tmr) ;
surveyBusy.hide();
})
.fail(function (jqXHR, textStatus, err) {
...
clearTimeout(tmr) ;
surveyBusy.hide();
});
这将在surveyBusy对象中设置一个方法,避免必须创建一个 setTimeout
窗口对象下的方法。它为您提供了更多可重复使用的东西!
surveyBusy = {
onTimer: function(n) {
elapsed = new Date.getTime() - start;
if (elapsed > n) surveyBusy.show();
}
}
surveyBusy.hide();
var start = new Date().getTime();
var elapsed = 0;
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
})
.fail(function (jqXHR, textStatus, err) {
...
})
.always(function() {
surveyBusy.onTimer(5000);
});
实际上,根据 这个页面描述了所有AJAX例程的回调, 你可以使用超时回调。这将要求你不要使用 $.getJSON
捷径。那么,为这个问题提供一个真实的答案, 是的,它在API中 但埋没的比 $.getJSON
捷径。
时间到 类型:Number设置请求的超时(以毫秒为单位)。这将覆盖使用$ .ajaxSetup()设置的任何全局超时。
超时时间从$ .ajax调用点开始;如果
其他几个请求正在进行中,浏览器没有
可用连接,请求可能超时
它可以发送。在jQuery 1.4.x及更低版本中,XMLHttpRequest对象
如果请求超时,将处于无效状态;访问任何
对象成员可能会抛出异常。仅限Firefox 3.0+,脚本
超时无法取消和JSONP请求;脚本会
即使它在超时期限后到达也会运行。
var n = 1000; //number of ms to wait
var done = false;
window.setTimeout(function(){
if(!done){
surveyBusy.show();
}
}, n);
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
...
done = true;
surveyBusy.hide();
})
.fail(function (jqXHR, textStatus, err) {
...
done = true;
surveyBusy.hide();
});