select2: handler.abort не является функцией - PullRequest
0 голосов
/ 04 сентября 2018

Я использую 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);
                }
            }

Есть предложения, что я тут не так делаю?

...