Обратные вызовы

Сейчас ты меня слышишь?

Какие?

Функция обратного вызова - это функция, переданная в другую функцию в качестве аргумента, которая затем вызывается внутри внешней функции для выполнения какой-либо процедуры или действия. (источник: Веб-документы MDN)

Если вы прочитали это и сразу вспомнили только Начало, вы не одиноки.

Давайте посмотрим на очень простую функцию для выполнения звонка:

Большой. Теперь, когда мы позвонили маме, наверное, нам стоит поговорить с ней.

Прохладный. Хорошее начало нашего телефонного звонка. Но это вроде как повторяющееся. И если я не собираюсь просто звонить кому-нибудь и спокойно дышать в трубку, я всегда что-нибудь сделаю после набора номера. Итак, давайте добавим функцию обратного вызова в нашу call() функцию.

Удивительный! Теперь мы можем получить тот же результат, не вызывая несколько функций. Кроме того, мы знаем, что наш код не записывает «Спроси маму, как прошел день» перед «Набери номер телефона мамы».

Почему?

1) Убедитесь, что все происходит по порядку

Хотя можно с уверенностью предположить, что этого не произойдет с этим простым кодом, важно помнить, что это не всегда так. Если нашей call() функции нужно было получить номер телефона из API перед набором номера, весьма вероятно, что наше приложение запустит нашу phoneConvo() функцию, все еще ожидая ответа API. Тогда мама отвечала на звонок посреди моего разговора и, вероятно, очень сбивалась с толку. Когда мы звоним в реал, мы не начинаем разговор, пока ищем контакт или пока звонит линия.

2) Сохраняйте гибкость функций

Когда я впервые исследовал обратные вызовы, я понял привлекательность вызова функций внутри других функций, но все равно застрял. Пока они находятся в одной области, у нас есть доступ.

Почему нам нужно передавать функцию обратного вызова в качестве аргумента?

Почему бы нам просто не вызвать функцию внутри функции?

А что, если я наберу номер телефона мамы, а она не ответит?

Используя обратный вызов, теперь я могу вызывать методы в зависимости от ситуации!