Запустим функцию по завершении другой с асинхронным аяксом (callBack)


Я снова со своими яваскриптами. Как говорится: «У кого чего болит – тот о том и говорит». А если серьёзно, то решений задачи больше одного, но сначала поподробнее о самой задаче.

Предположим в своём javascript-сценарии вам хочется без перезагрузки страницы вытащить какую-то информацию, скажем, из базы данных и на этой же странице произвести какие-то действия, основываясь на полученных данных. Ясен пень, придётся пользовать AJAX. И если вы не хотите «повесить» браузер, свой сайт, а может и весь веб-сервер, то лучше воспользоваться аяксом в асинхронном режиме. Что это даёт? Ну, в общем случае сценарий не ждёт окончания работы аякса, не ждёт возвращённых оттуда данных и просто продолжает выполнять последующие инструкции. Почитайте на досуге что-нибудь про многопоточность, чтобы стало яснее, о чём я. Современные браузеры даже сами вам дадут знать – напишут в консоли, что использовать ajax синхронно – нехорошо.

Однако во втором абзаце я сказал, что нам нужно дождаться загрузки этих данных. Предположим, нам важно, что именно вернёт запрос, чтобы на основе этой информации произвести ветвление сценария: вернулось одно значение – выполняем одни инструкции, при другом значении – другие. На лицо конфликт – браузер и здравый смысл подсказывают пользовать аякс асинхронно, а логика программы совсем наоборот. Как быть?

Ну, про промисы поговорим как-нибудь в другой раз, может быть :), а пока поговорим про обратный вызов функций, то есть про коллбэки.

Итак, вот решение: пишем разные функции на случай разных значений, которые прилетели в аяксе, и для наглядности, объявляем их как переменные.

А затем оформляем функцию, где расположен ajax-запрос. Оговорюсь, что я часто использую библиотеку jQuery и аякс-запрос буду оформлять с её помощью, не пугайтесь.

// функция для первого значения из запроса
var func1 = function()
{
    // какие-то действия
}

// функция для второго значения из запроса
var func2 = function()
{
    // другие действия
}

// функция с аякс-запросом
function funcWithAJAX(callBack1, callBack2)
{
    $.ajax({
        async: true,
        // другие инструкции с данными для запроса и адресом php-скрипта для обработки
        success: function(data)
        {
            // для простоты, пусть запрос из аякса вернёт число 1 или 2
            if (data == 1)
            {
                if (typeof callBack1 === 'function') callBack1();
            }
            else
            {
                if (typeof callBack2 === 'function') callBack2();
            }
        }
    });
}
// и наконец, то место программы, где и происходит магия :))  
// вызываем функцию с аяксом, передаём ей определённые ранее функции в качестве аргументов, следите за тем, чтобы после имён случайно не затесались скобочки. :)  
funcWithAJAX(func1, func2);

Если вы смотрели прошлую заметку на тему javascript, то наверное могли заметить, что проверку аргументов на то, являются ли они функциями, я почти без изменений взял оттуда. Кроме того, следует внимательно следить за тем, чтобы вызывая функцию с коллбэками, имена функций обратного вызова передавались бы без скобок, иначе функция таки запустится сразу, ещё до запуска основного запроса из аякса.

И последнее. Примеры, конечно, не полны, нет фрагментов кода для вывода ошибок, если аякс-запрос выполнился неуспешно, но это уже совсем другая история.


Comments 1


@quazimorda, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:

  • Потенциальных Выплаты - 7 позицию - 2,33 GBG
21.05.2020 06:05
0