Я использую select2, чтобы заполнить один из выпадающих в моем коде. Недавно меня попросили зафиксировать ошибку сервера 500 и показать более приятное сообщение об ошибке конечному пользователю при таких неудачных вызовах Ajax к серверу. Я использовал один из предложенных способов использования метода транспорта для подключения моих успешных и неудачных вызовов к объекту ajax, как показано ниже.
var _that = this;
return {
multiple: true,
ajax: {
quietMillis: 100,
url: '<url>', // available test sections are the same for nodes and enemy test sections
type: 'POST',
data: dataObject,
results: (data: any, page: number, context: any) => {
return {
results: data,
context: context
};
},
/* using transport to hook fail method for any server errors like 500. */
transport: function (params: any, success: any, failure: any) {
//chaining the success and fail calls.
return $.ajax(params)
.then(success)
/* pass on the failed select2 object so that callback method ensure to close the dropdown */
.fail(_that.select2LoadingFailed.bind($.extend(_that, { failedSelect2: this})));
},
}
Конечно, это важная часть объекта select2, а не полный код, но я думаю, этого достаточно, чтобы объяснить, как я использую select2.
Теперь при первых 500 ошибках, вызовы фактически были переданы методу that.select2LoadingFailed, однако при последовательных вызовах я получаю ошибку ниже, чем в select2 js
Uncaught TypeError: handler.abort is not a function
at select2.js:379
И это код виновника в select2
function ajax(options) {
var timeout, // current scheduled but not yet executed request
requestSequence = 0, // sequence used to drop out-of-order responses
handler = null,
quietMillis = options.quietMillis || 100,
ajaxUrl = options.url,
self = this;
return function (query) {
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
requestSequence += 1; // increment the sequence
var requestNumber = requestSequence, // this request's sequence number
data = options.data, // ajax data function
url = ajaxUrl, // ajax url string or function
transport = options.transport || $.ajax,
type = options.type || 'GET', // set type of request (GET or POST)
params = {};
data = data ? data.call(self, query.term, query.page, query.context) : null;
url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
//this guy is throwing error on .abort method call
if( null !== handler) { handler.abort(); }
if (options.params) {
if ($.isFunction(options.params)) {
$.extend(params, options.params.call(self));
} else {
$.extend(params, options.params);
}
}
Есть предложения, что я тут не так делаю?