2017-02-17 55 views
1

jQuery如何才能在所有.done或.fail處理程序之後觸發.always處理程序?jQuery fire .always處理程序全部附加.done/.fail處理程序

舉例來說,如果我有一個返回推遲這樣的功能:

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 !'); 
      }); 
} 

我可以有一個全球性的。總是處理程序,並附加一個特定.done處理程序是這樣的:

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

在jQuery中,處理程序似乎以我們附加它們的相同順序調用。在我的情況下,.done在.done之前。

+0

根據[jQuery .always](https://api.jquery.com/deferred.always/)文檔►'當Deferred被解決或被拒絕時,回調會按照它們添加的順序執行,使用提供的參數。由於''geDeferred()'在額外的'.done'之前解決,所以'.always() getDeferred()'首先被調用。 – Nope

+0

它看起來合法!但是有沒有什麼技巧可以做我想做的事情? –

回答

1

在jQuery中,處理程序似乎是按照我們附加 的順序調用它們。在我的情況下,.always before .done

當Deferred被解析或拒絕時,回調會按照它們添加的順序執行。
jQuery eferred.always Documentation

因此它是有道理的額外.done

之前有沒有什麼技巧,做我想做的事情中getDeferred的處理程序被執行?

我不知道是否有一個特定的延遲對象的方式,但你可以傳遞額外的處理程序作爲參數,並根據需要執行它們。

下面看起來可能有點複雜,最有可能的是更好的方法,但它應該工作。

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(...)

+0

通過它參數是我想要做的。 +1爲$ .extend :) –