アプリケーションでは、jQuery deferred を使用して、Ajax の成功とエラー処理を中央の場所に実装したいと考えています。データ オプションに文字列を入れるとすべてがうまく機能しますが、データ オプションに配列を入れたい場合は、これを文字列として送信します。
私の延期された実装:
Application = {
ajax: function(options) {
var deferred = $.Deferred(function (d) {
var defaults = {
cache: false,
type: 'post',
traditional: true,
dataType: 'json'
},
settings = $.extend({}, defaults, options);
d.done(settings.success);
d.fail(settings.error);
d.done(settings.complete);
var jqXHRSettings = $.extend({}, settings, {
success: function (response, textStatus, jqXHR) {
/*
JSON Reponse
{
status: 'error' or 'success',
code: 200, (HTTP codes or own codes between 600 and 700 for business logic errors)
data: { <result> }
}
*/
if (settings.dataType === 'json') {
if (response.status == 'success') {
// Just resolve and give data back
d.resolve(response.data);
} else if (response.status == 'error') {
// Implement error handling
d.reject(response.data);
}
} else {
d.resolve(response);
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
d.reject(jqXHR);
},
complete: d.resolve
});
$.ajax(jqXHRSettings);
});
var promise = deferred.promise();
promise.success = deferred.done;
promise.error = deferred.fail;
promise.complete = deferred.done;
return promise;
}
};
この遅延関数の私の実装 (動作しません!):
// Retrieve all sessions from fullcalendars
var ajax = Application.ajax({
url: Routing.generate($this.options.ajaxScheduleSessionsRoute, { _format: 'json', id: this.options.scheduleId }),
data: {
"rooms": $this._rooms // $this._rooms is an array! [1, 2, 3, 4, 5]
}
});
ajax.fail(function(jqXHR, textStatus, errorThrown){
console.log(jqXHR);
});
ajax.done(function(response, textStatus, jqXHR){
console.log(response);
});
結果 ([] がありません)
上記の遅延関数を使用する前の jQuery ajax のデフォルトの実装 (これは機能します!):
$.ajax({
type: 'POST',
url: Routing.generate($this.options.ajaxScheduleSessionsRoute, { _format: 'json', id: this.options.scheduleId }),
data: {
"rooms": $this._rooms
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText);
},
success: function(data) {
$.each(data, function( key, source ) {
var roomId = key;
console.log(source);
$('#calendar'+key).fullCalendar( 'addEventSource', source );
});
},
dataType: 'json'
});
結果 ([] 付き)
質問: jQuery Ajax を使用したデフォルトの実装が機能し、遅延関数が機能しないのはなぜですか?