我正在致力於擴展jQuery的ajaxPrefilter
接口以向AJAX調用添加其他功能;即在beforeSend()
方法中使用setRequestHeader()
將報頭數據添加到XHR請求中。事情是,ajaxPrefilter
和ajax調用本身都可以包含beforeSend
選項,其中一個或兩個都可以包含異步功能。如何正確使用jQuery延遲/承諾自動調用的函數,如.ajax()的beforeSend()?
假設我ajaxPrefilter
看起來這樣:
(function($) {
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var auth = $.cookie("fake_site"),
normalizedRequest = $.Deferred();
if (originalOptions.authorizeUser) {
options.beforeSend = function() {
jqXHR.setRequestHeader("Authorization", "Session " + auth);
}
// resolving the jqXHR Deferred, statusCode handling, etc.
}
});
})(jQuery);
現在,無論選項和originalOptions可能包含beforeSend()
方法,我想options.beforeSend來總是先執行。這似乎是一個總理候選人遞延/承諾用法,但由於事實beforeSend
自動調用,我不能做到這一點:
options.beforeSend = function(jqXHR) {
// setting the request header; creating, resolving, and returning the Deferred
}
$.when(options.beforeSend(jqXHR)).then(function() {
originalOptions.beforeSend();
});
正如預期的那樣,這將導致options.beforeSend
開火兩次;這是由於其定義聲明和$.when
呼叫。
如何使用Deferreds/promise來管理自動調用的方法,如beforeSend
?