Поэтому сегодня утром я создавал случайные функции обратного вызова с намерением реально заставить его застрять в моем мозгу о том, как и почему я буду использовать их.
Я пришел к выводу, что функция обратного вызова передается как параметр другой функции с намерением использовать данные из первой функции, чтобы что-то сделать в функции обратного вызова? Дайте мне знать, если моя интерпретация имеет смысл, или если я покину вас.
И я бы использовал эти функции обратного вызова для того, чтобы ждать данных, необходимых из другой функции, чтобы сделать мой обратный вызов?
Для меня это кажется самой странной, но самой сложной концепцией. Мне нравится 1 день, когда я чувствую себя уверенно, а потом через неделю снова запутался.
Интерпретация правильна. Обратный вызов - это функция, которая используется для переадресации, как следует из названия:
function callMeBackPleaseAndSayWakeUp(phrase) {
say(phrase);
}
function aFriendWhoLovesToWorkAsAHumanAlarm(timeSpan, callback) {
setTimeout(() => callback('Wake up'), timeSpan);
}
aFriendWhoLovesToWorkAsAHumanAlarm(60 * 60 * 9, callMeBackPleaseAndSayWakeUp);
Обратные вызовы являются базовыми механизмами для слабосвязанных частей приложения для взаимодействия друг с другом.
Представьте себе некоторую функцию, которая требует времени для завершения, например, setTimeout
внутри функции, поэтому вы хотите запустить другую функцию после завершения setTimeout
. Вы не можете сделать это с помощью только функции вызова один за другим, потому что он только начнет обратный отсчет и перейдет к следующей функции. Поэтому вам нужно сделать функцию внутри этого setTimeout
и передать функцию в качестве аргумента при первом вызове функции обратного вызова AKA.
Теперь вы бы подумали: "Но я могу просто вставить блок кода внутри функции setTimeout
function doItAfterMinute(){
setTimeout(()=>{
//block of code
},60000)
}
Правда, но что, если через минуту у вас будет 10 различных функций, вы не будете делать 10 функций setTimeout
с 10 разными именами? Это тот случай, когда обратный вызов показывает свою мощность.
function doItAfterMinute(cb){
setTimeout(()=>{
cb()
},60000)
}
doItAfterMinute(()=>{ console.log('hey, minute passed!)) doItAfterMinute(()=>{ console.log('hey, another minute!))
И я бы использовал эти функции обратного вызова для того, чтобы ждать данных, необходимых из другой функции, чтобы сделать мой обратный вызов?
Это один из распространенных вариантов использования: вы ждете данных, которые будут недоступны до некоторого будущего времени.
Другой вариант использования: вам просто нужно уведомление о том, что что-то произошло. Процесс успешно завершен (или безуспешно), и вы хотите обновить интерфейс.
Еще один: вам нужно сообщить, что прошло некоторое время. setTimeout()
и setInterval()
- прекрасные примеры.
Чтобы попробовать, поднимите консоль в своем браузере (⌘-Alt-I на Mac, Ctrl-Shift-I или что-то еще на других машинах) и введите следующее:
setTimeout(() => console.log("Two seconds later"), 2000);
и через две секунды...