【发布时间】:2017-02-07 13:44:15
【问题描述】:
我有一个小问题,我很想用 jQuery 3 正确解决。所以想法是这样的:
- 执行 AJAX 请求
- 等待响应。如果 500ms 后没有响应,则显示 spinner
- 收到回复后隐藏微调器。
我目前有一些工作。但问题是:这是正确的还是首选的方式?
// helper function for setTimeout
function wait(ms) {
var deferred = $.Deferred();
setTimeout(function() { deferred.resolve() }, ms);
return deferred.promise();
}
var request = $.ajax({
dataType: "json",
url: "/api/articles/?" + $.param(params)
});
wait(500).then(function() {
if (request.state() === "pending") // works, but the docs says we should do this only for debugging purposes
$(".spinner").show();
});
request.always(function() {
$(".spinner").hide();
);
我们可以这样使用request.state()吗?可以用更优雅的方式解决这个问题吗?
【问题讨论】:
-
var deferred = $.Defereed();应该是var deferred = $.Deferred();。 -
试试看这个,你需要的应该就在最上面api.jquery.com/Ajax_Events
-
我建议使用带有
animation-delay: 500;的CSS 动画。在触发 AJAX 请求时应用具有动画微调器的类,在响应时从元素中删除该类。 -
我要做的是在全局范围内保存对计时器的引用,以便我可以检查它并在适当时取消它。像
var timer; /* global scope */然后timer = setTimeout(...);。setTimeout()调用的函数是function showTimer() { $(".spinner").show() },当 AJAX 完成后,取消计时器:timer.clearTimeout();并清除加载指示器($(".spinner").hide();)。
标签: jquery ajax jquery-deferred