所有附加的.done / .fail处理程序之后的jQuery fire .always处理程序

时间:2017-02-17 09:10:00

标签: 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之前。总是。

1 个答案:

答案 0 :(得分:1)

  

在jQuery中,处理程序似乎按照我们附加的顺序调用   他们。在我的情况下,.al之前.done

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

因此,.done中的处理程序在附加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);

然后这样称呼:

.done

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