私はjQueryのajaxPrefilter
インターフェースを拡張して、AJAX呼び出しに機能を追加することに取り組んでいます。つまり、メソッドsetRequestHeader()
内を使用してヘッダーデータをXHRリクエストに追加します。beforeSend()
重要なのは、ajaxPrefilter
と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
2回発火します。その定義ステートメントと$.when
呼び出しの両方が原因です。
延期/約束は、次のような自動呼び出しメソッドを管理するためにどのように使用されbeforeSend
ますか?