Инкапсулированные вызовы Ajax в класс и работают странно, когда я использую его для загрузки файлов - PullRequest
0 голосов
/ 13 января 2019

Я недавно использовал множество методов Ajax в одном из моих проектов, так как при каждом вызове $ .ajax вам приходится писать много одинаковых кодов, например:

{
  type:'POST', // Default value is 'GET'
  beforeSend: function(xhr){
    // Usually do some Page Loading Animation stuff here
  },
  error:function(){
    // Handling the Exceptions here
  }
}

Итак, я инкапсулировал вызов Ajax в класс, называемый JAjax, например:

(function ($) {

// More details, see: http://api.jquery.com/jquery.ajax/
var defaults = {
    data: {},
    url: '',
    type: 'POST',
    dataType: 'JSON',
    isOverlay: true,
    async: true,
    cache: true,
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    processData: true,
    overlayTarget: $(document.body),
    dealyClean: 500,
    f_before: function () {},
    f_done: function () { },
    f_always: function () { },
    f_fail: function (xhr) {
        if (xhr.status !== 200) {
            // Handling the Exceptions
        }
    }
};

function JAjax(_options) {
    this.options = $.extend({}, defaults, _options);
    this.execute();
}

function createOverLayer(options) {
    // Create a page loading animation layer
}

JAjax.prototype = {
    execute: function () {

        var parent = this;

        var response = $.ajax({
            data: parent.options.data,
            url: parent.options.url,
            type: parent.options.type,
            dataType: parent.options.dataType,
            contentType: parent.options.contentType,
            async: parent.options.async,
            cache: parent.options.cache,
            processData: parent.options.processData,
            beforeSend: function (xhr) {
                parent.options.f_before();
                if (parent.options.isOverlay) {
                    createOverLayer(parent.options);
                }
            }
        });

        response.done(parent.options.f_done);
        response.always(parent.options.f_always);
        response.fail(parent.options.f_fail);

    }
};

jQuery.extend({
    jajax: function (_options) {
        _options = _options || {};
        if (typeof _options === 'object') {
            return new JAjax(_options);
        }
    }
});
})(jQuery);

Для большинства запросов Ajax (GET, POST) он работает нормально. Но когда я использую его для загрузки некоторых файлов, файл успешно загружается на сервер и возвращает мне имя файла (строку) в качестве результата выполнения. Но почему-то она не запускает функцию f_done, ниже показано, как я использую ее для загрузки файлов:

var url = '/ajax_common_file_upload';
var file_data = new FormData();
for (var i = 0; i < _files.length; i++) {
    var file = _files[i];
    file_data.append('input_files[]', file);
}

$.jajax({
    url: url,
    data: file_data,
    cache: false,
    contentType: false,
    processData: false,
    f_done: function (result) {
        // Never to be executed :-(
        alert('show me something, please!');
    }
});

Я потратил несколько дней, чтобы попытаться выяснить, почему это не «ПОКАЖИТЕ ЧТО-ТО», а все провалилось, и я буду очень признателен за то, что кто-то может мне помочь и объяснить, почему метод f_done () не может быть запущен, когда я использую это для загрузки файлов.

Обновление: Я сделал несколько скриншотов для JAjax и оригинального $ .ajax по заголовкам запросов и объединил их, как показано ниже: enter image description here

Я использовал одни и те же параметры, чтобы сделать запрос для JAjax и $ .ajax, но я не знаю, почему у них другое значение Accept!

КАЖДЫЙ

1 Ответ

0 голосов
/ 22 февраля 2019

Все еще не может вызвать функцию f_done () !!! но так как я могу сделать то же самое в f_always (), я собираюсь пропустить это и двигаться дальше. Я буду держать этот пост открытым и всегда буду благодарен за любые предложения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...