Обратный вызов в jQuery

У меня есть следующий код, в котором используется функция ajaxSuccess(). Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда запрос AJAX завершается успешно, а jQuery запускает событие the ajaxSuccess, выполняются все методы ajaxSuccess().

Я думаю, что лучшим решением будет передать обратный вызов, но я не могу понять, как я могу его использовать, поскольку я новичок в этом.

('#drop1').on('select2:select', (e) => {
    const selectedMake = e.params.data;
    utils.emptySelect2('#drop2');
    utils.emptySelect2('#drop3');
    utils.populateSelect2(`apiURL`, '#drop2');

    $(document).ajaxSuccess(() => {
        $('#drop3').select2('close');
        $('#drop2').select2('open');
    });
});

Вызов AJAX:

populateSelect2(url, element, key) {
    $.get(url)
        .done((res) => {
            if (res) {
                let data = $.map(key ? res[key] : res, (obj) => {
                    obj.text = obj.name;
                    return obj;
                });
                data = sortBy(data, 'name');

                $(element).select2({
                    placeholder: 'please enter',
                    data
                });
            }
        })
        .fail(() => {
            this.showError(`Failed to call ${url}`);
        });
}
.ajaxSuccess - это глобальный обработчик, который срабатывает при каждом успешном выполнении каждого вызова ajax. Вы можете передать объект ajax в select2, который может включать параметр .success, или вы можете использовать цепочку .done() объекта ajax. select2.org/data-sources/ajax
freedomn-m 23.10.2018 12:08

Вы определяете новый обработчик ajaxSuccess() каждый раз, когда срабатывает событие select2:select. Это само по себе проблема. Если вы хотите, чтобы логика в ajaxSuccess срабатывала только для определенных запросов AJAX, вам нужно будет предоставить функцию обратного вызова. Как вы это сделаете, зависит от того, как вы выполняете вызовы в функции populateSelect2. Если вам нужна помощь с этим, нам нужно увидеть код этой функции.

Rory McCrossan 23.10.2018 12:11

Не могли бы вы поделиться своим кодом запроса ajax?

McBern 23.10.2018 12:11

просто добавил код вызова ajax

Ikt 23.10.2018 13:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
119
4

Ответы 4

Когда вы используете JQuery.ajaxSuccess (), вы «ловите» все запросы, сделанные вашим браузером. Если вы хотите получить ответ, в частности, на один звонок (что часто бывает), вам необходимо использовать обратный вызов.

Например :

$.ajax({
        type:"POST",
        url:"/myUrl"
        success:function(data){
            alert(data);
        }
    });

Параметр data, имеющий ответ от сервера.

P.S: вы можете заменить обратный вызов успеха любой функцией, которую хотите использовать.

Я только что поделился своим вызовом ajax выше, я понятия не имею, как использовать обратный вызов успеха

Ikt 23.10.2018 13:47

Внутри метода utils.populateSelect2 вы будете вызывать вызовы ajax для получения данных. Там вы можете поддерживать обратные вызовы успеха или неудачи. Если вы напрямую подключаете метод ajaxSuccess к объекту документа, тогда для всех последующих вызовов ajax будет вызываться ваш метод ajaxSuccess.

 $.ajax({
        url: '??',
        dataType: '??',
        success: function (data, status) {
            console.info(data.responseText);
        },
        error: function(jqXHR, textStatus, errorThrown) {
        }
    })

Спасибо за комментарий. Я просто поделился приведенным выше кодом ajax. Я не знаю, как передать обратный вызов utils.populateSelect2 ()

Ikt 23.10.2018 13:35

Фрагмент вызова jQuery ajax. Зарегистрируйте успешный и ошибочный обратный вызов, чтобы получить ответ API.

$.ajax({
    type: 'GET',
    url: "https://reqres.in/api/users/2",
    dataType:"json",
    success: function(data){
            console.info("success");    
    },
    error:function(error){
        console.info("error");
    }
      });

Если я вас правильно понял, вы можете сделать что-то вроде этого:

('#drop1').on('select2:select', (e) => {
    const selectedMake = e.params.data;
    utils.emptySelect2('#drop2');
    utils.emptySelect2('#drop3');
    utils.populateSelect2(
        `apiURL`,
        '#drop2',
        // success callback
        (res) => console.info(res),
        // fail callback
        () => console.info(fail)
    );

    $(document).ajaxSuccess(() => {
        $('#drop3').select2('close');
        $('#drop2').select2('open');
    });
});

populateSelect2(url, element, key, success, fail) {
    $.get(url)
        .done((res) => {
            // ...

            success(res);
        })
        .fail(() => {
            // ...

            fail();
        });
}

Другие вопросы по теме