javascript - jQuery 在所有附加的 .done/.fail 处理程序之后触发 .always 处理程序

标签 javascript jquery ajax handler jquery-deferred

在 jQuery 中,如何仅在所有 .done 或 .fail 处理程序之后才触发 .always 处理程序?

例如,如果我有一个返回延迟的函数,如下所示:

function getDeferred() {
   return $.ajax({
             url: '/test.json',
             type: 'GET',
             dataType: 'json',
             cache: false
          }).fail(function (jqXHR, textStatus, errorThrown) {
             alert('fail !');
          }).always(function (jqXHR, textStatus, errorThrown) {
             alert('always !');
          }); 
}

我可以有一个全局 .always 处理程序并附加一个特定的 .done 处理程序,如下所示:

getDeferred().done(function (data, textStatus, jqXHR) {
   alert('done !');
});

在 jQuery 中,处理程序的调用顺序似乎与我们附加它们的顺序相同。就我而言,.总是在.done之前。

最佳答案

In jQuery, handlers seem to be called in the same order we attach them. In my case, .always before .done

当延迟被解决或拒绝时,回调将按照添加的顺序执行。
jQuery eferred.always Documentation

因此,getDeferred 中的处理程序在附加 .done 之前执行是有意义的

Is there any tricks to do what I want to do ?

我不知道是否有特定的延迟对象方式,但您可以将附加处理程序作为参数传递并根据需要执行它们。

下面的内容可能看起来很复杂,很可能有更好的方法,但它应该可行。

function getDeferred(handlers) {
    var defaultHandlers = {
        done: {},
        fail: {},
        always:{},
    }

    var _handlers = $.extend({}, defaultHandlers, handlers);

    return $.ajax({
        url: '/test.json',
        type: 'GET',
        dataType: 'json',
        cache: false
    }).done(function(jqXHR, textStatus, errorThrown) {
        if ($.isFunction(_handlers.done)) {
            _handlers.done();
        }
    }).fail(function(jqXHR, textStatus, errorThrown) {
        alert('fail !');
        if ($.isFunction(_handlers.fail)) {
            _handlers.fail();
        }
    }).always(function(jqXHR, textStatus, errorThrown) {
        alert('always !');
        if ($.isFunction(_handlers.always)) {
            _handlers.always();
        }
    });
}

然后这样调用它:

var handlers = {
    done: function(data, textStatus, jqXHR) {
        alert('done !');
    }
}

getDeferred(handlers);

这将根据您的需要在 .always 之前执行您的 .done 。好处是,如果您仍然希望在 getDeferred() 完成后执行某些操作,您仍然可以执行 getDeferred(handlers).done(...)

关于javascript - jQuery 在所有附加的 .done/.fail 处理程序之后触发 .always 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293739/

相关文章:

javascript - 在不损害页面响应能力的情况下设置 col-md-* div 类之间的边距

javascript - 当动画 div 跨越坐标时随机重新放置一个 div 元素

javascript - jquery keyup 函数后,ajax 请求未提交到数据库

php - Jquery AJAX 发布到 PHP

javascript - Chrome 扩展程序 : How to send html form data to a php page upon button being clicked which redirects to said php page

javascript - 异步、回调和 OOP JavaScript : how do I organize this?

javascript - Json 字符串化更改日期

jquery - 在 JTable 中显示日期和时间

javascript - 比较 NodeJs 和 Express 中的两个 JSON

javascript - 服务器端之前的客户端验证