11

我有一些 JavaScript:

surveyBusy.show();

$.getJSON(apiUrl + '/' + id)
    .done(function (data) {
        ...
        surveyBusy.hide();
    })
    .fail(function (jqXHR, textStatus, err) {
        ...
        surveyBusy.hide();
    });

但是,我只想surveyBusy.show();$.getJSON花费超过n毫秒数的情况下发布。否则你会闪烁。api上有回调getJSON可以做到这一点吗?我在文档中什么也没看到。

4

7 回答 7

12

只需使用超时。另外,我将您的“隐藏”代码放在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();        
    });
于 2013-08-09T13:34:05.067 回答
4

如果在激活之前返回结果,则将您的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();        
    });
于 2013-08-09T13:34:14.017 回答
0

实际上,根据this page,它描述了所有AJAX例程的回调,您可以使用一个超时回调。这将要求您不要使用$.getJSON快捷方式。因此,要为这个问题提供一个真正的答案,是的,它在 API 中,$.getJSON但比快捷方式更深。

timeout类型:Number 设置请求的超时时间(以毫秒为单位)。这将覆盖使用 $.ajaxSetup() 设置的任何全局超时。超时时间从 $.ajax 调用开始;如果其他几个请求正在进行中并且浏览器没有可用的连接,则请求可能会在发送之前超时。在 jQuery 1.4.x 及以下版本中,如果请求超时,XMLHttpRequest 对象将处于无效状态;访问任何对象成员都可能引发异常。仅在 Firefox 3.0+ 中,脚本和 JSONP 请求不能被超时取消;即使脚本在超时期限之后到达,它也会运行。

于 2013-08-09T14:29:48.310 回答
0

使用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();
    });
于 2013-08-09T13:34:46.463 回答
0

尝试设置超时,然后在服务器响应时取消它:

// 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();
    });
于 2013-08-09T13:36:05.833 回答
0

这将在surveyBusy 对象中设置一个方法,从而避免setTimeout在window 对象下创建一个方法。它为您提供了更多可重用的东西!!

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);
    });
于 2013-08-09T13:45:56.440 回答
-1
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();
    });
于 2013-08-09T13:34:38.593 回答