问题 仅当getJSON超过n毫秒时才显示元素?


我有一些JavaScript:

surveyBusy.show();

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

但是,我只想发布 surveyBusy.show(); 如果 $.getJSON 需要更多 n 毫秒数。否则你会闪烁。是否有回调 getJSON 能做到这一点的api?我懂了 文档中没有任何内容


6171
2017-08-09 13:30


起源

我刚刚发布了一个答案,为您提供AJAX API中提供的回调,无需额外代码即可完成此操作。 - DevlshOne


答案:


只需使用超时。另外,我把你的“隐藏”代码放在了 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();        
    });

12
2017-08-09 13:34



4个提议的几乎完全相同的解决方案 - Michel Feldheim
我建议的改进是参考 window 调用方法时的对象 setTimeout 和 clearTimeout。除此之外,+1。 - rink.attendant.6
@ rink.attendant.6为什么? - Ian
@Ian表示您要使用的方法是附加到的方法 window 对象以防万一 setTimeout 和 clearTimeout 正在全局命名空间中的其他地方重新定义,这可能是也可能不是故意的。 - rink.attendant.6
@ rink.attendant.6没有理由用你的代码污染你的代码 window. 前缀。你用吗 window. 到处?你正在用吗 window.document.whateverMethod?或者您创建的每个全局变量/函数?我希望不会,对于隐含的东西来说,这有点过分了。如果它被重新定义在全局命名空间的其他地方,那么就无法解决这个问题 - 添加 window. 并没有神奇地找到原件...它已经被覆盖了 - Ian


把你的 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();        
    });

4
2017-08-09 13:34



比我好...... - Johnny5


使用 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();
    });

0
2017-08-09 13:34





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

// 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();
    });

0
2017-08-09 13:36





这将在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);
    });

0
2017-08-09 13:45



我必须尝试一下,但我很确定这不起作用,因为 always 直到没有执行 后 它得到了回应。 - Mike Perrenoud
@TheSolution这不是OP所要求的吗?它必须至少需要“n”秒或者 .show() 没有发生。或者我误读了吗? - DevlshOne


实际上,根据 这个页面描述了所有AJAX例程的回调, 你可以使用超时回调。这将要求你不要使用 $.getJSON 捷径。那么,为这个问题提供一个真实的答案, 是的,它在API中 但埋没的比 $.getJSON 捷径。

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


0
2017-08-09 14:29



也许展示一个转换他们的例子 $.getJSON 拨电至 $.ajax (这应该不多),所以他们可以利用 timeout - Ian
虽然我很确定是否达到超时,但是 fail 执行回调,这可能是不希望的 - Ian
“非常肯定”和“可能”听起来只是一个尝试使我的答案无效而不是受过教育的评论的理由。 - DevlshOne
而解决方案要求提供与API相关的答案,而不是代码片段,这正是我提供的。 - DevlshOne
不幸的是,他们询问了一个API 回电话,所以如果你想成为技术人员,你的答案是无关紧要的。就像我说的,如果你打扰提供一个例子并测试它,你会发现它的含义。对不起,我不在乎自己测试,这不是我的答案 - Ian


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();
    });

-1
2017-08-09 13:34