dataFilter
のプロパティを$.ajax
確認する必要があります。このプロパティは、リクエストを受け取った直後で、ハンドラが実行される前に実行される関数を受け入れます。これの主な目的は、受信したデータを jQuery 自体で処理する前に前処理することです。したがって、生データを受け取ります。ログインなどの中間プロセスをそこで実行できます。
この構成をすべての ajax 呼び出しにパッチするために、すべての ajax 要求$.ajaxSetup
を事前定義dataFilter
するために使用します。したがって、各 ajax リクエストには、dataFilter
ローカル ハンドラーが実行される前にハンドラーが実行されます。
サンプル コードについては、デモがあり、ほとんど期待どおりに動作します。
function login() {
console.log('login initiated: you are not logged in');
}
$.ajaxSetup({
dataFilter: function (origdata, type) {
//the type is determined by the type you indicated in the ajax call
//if not json, we return the data unharmed
if (type !== 'json') return origdata;
//data filter receives the raw response. since we have determined it's json
//we parse it using jQuery's parseJSON to check the contents
var data = $.parseJSON(origdata);
if (data.auth) {
//if logged in, we just return the data
return origdata;
} else {
//otherwise, we execute the login
//since returning something is required, we return false so local handler
//data checks will fail against the false data
login();
return false;
}
}
});
//the url and data passed is for jsFiddle to work.
//logged in
$.post('/echo/json/', {
json: JSON.stringify({
auth: true
})
}, function (data) {
//in our handler, it's your normal "check data before use"
//if data is truthy, it skips this check and moves on
if(!data) return;
console.log('data retrieved successfully', data);
}, 'json');
//not logged in
$.post('/echo/json/', {
json: JSON.stringify({
auth: false
})
}, function (data) {
//since we returned false, the code stops at this check
if (!data) return;
console.log('you should not see this since data is false, per dataFilter return', data);
}, 'json');