我正在扩展 jQuery 的ajaxPrefilter
界面以向 AJAX 调用添加额外的功能;setRequestHeader()
即在方法中使用将标头数据附加到 XHR 请求上beforeSend()
。问题是,theajaxPrefilter
和 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);
现在,options和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/promises 如何用于管理自动调用的方法,例如beforeSend
?