Функция обратного вызова
Tags: node, piton, callbackfunction
Published: 2024-03-25 03:56:31

Первая мысль, что это какая-то особенным образом написанная функция, нет.

Функция обратного вызова — это не особая функция, которую нужно писать каким-то специфическим образом. Это, скорее, роль, которую может играть любая функция в контексте других функций.

Суть заключается в следующем:

Есть методы, например, у массивов, такие как map, filter, reduce и другие.
Эти методы для выполнения своей работы нуждаются в логике, которая определяет, что делать с каждым элементом массива.
Эта логика задается с помощью функции, которую нужно передать в метод в качестве аргумента.
Функция, которая передается в метод, и называется функцией обратного вызова.
Почему “обратного”?

Количество вызовов функции обратного вызова зависит от количества элементов в массиве.
Метод как бы “перебирает” все элементы массива и для каждого элемента вызывает функцию обратного вызова.
Пример:

Python

```
def my_func(x):
  return x * 2
numbers = [1, 2, 3, 4, 5]
# Функция my_func будет вызвана 5 раз, по одному разу для каждого элемента в numbers
result = map(my_func, numbers)
print(result)  # Output: [2, 4, 6, 8, 10]
```
В этом примере:

my_func – это функция обратного вызова.
map – это метод, который принимает функцию обратного вызова и массив в качестве аргументов.
map перебирает все элементы массива numbers и для каждого элемента вызывает my_func.
my_func возвращает удвоенное значение каждого элемента.
map возвращает массив с результатами вызовов my_func.
Функции обратного вызова — это мощный инструмент, который позволяет упростить код и сделать его более читаемым.

Использование функций обратного вызова:

Делает код более читаемым и понятным.
Позволяет избежать дублирования кода.
Делает код более лаконичным.
Примеры использования функций обратного вызова в NodeJS
Методы массива:
a) map:

JavaScript

```
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map((number) => number * 2);
console.log(doubledNumbers); // [2, 4, 6, 8, 10]
```
В этом примере:

map – метод массива, который применяется к каждому элементу массива и возвращает новый массив.
(number) – функция обратного вызова, которая принимает один аргумент number, представляющий текущий элемент массива.
number * 2 – выражение, которое вычисляет удвоенное значение number.
doubledNumbers – новый массив, содержащий удвоенные значения элементов исходного массива.
b) filter:

JavaScript

```
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter((number) => number % 2 === 0);
console.log(evenNumbers); // [2, 4]
```
В этом примере:

filter – метод массива, который применяется к каждому элементу массива и возвращает новый массив, содержащий только те элементы, для которых функция обратного вызова возвращает true.
(number) – функция обратного вызова, которая принимает один аргумент number, представляющий текущий элемент массива.
number % 2 === 0 – выражение, которое проверяет, является ли number четным числом.
evenNumbers – новый массив, содержащий только четные числа из исходного массива.
2. Map:

JavaScript

```
const myMap = new Map([
  ['a', 1],
  ['b', 2],
  ['c', 3],
]);
const doubledValues = myMap.forEach((value, key) => {
  console.log(`Ключ: ${key}, значение: ${value}`);
  myMap.set(key, value * 2);
});
console.log(myMap); // Map { 'a' => 2, 'b' => 4, 'c' => 6 }
```
В этом примере:

forEach – метод объекта Map, который применяется к каждой паре ключ-значение в объекте Map и не возвращает значения.
(value, key) – функция обратного вызова, принимает два аргумента: value – значение, связанное с текущим ключом, и key – текущий ключ.
console.log – используется для отображения информации о текущей паре ключ-значение.
myMap.set(key, value * 2) – используется для обновления значения, связанного с текущим ключом, в два раза.
myMap – объект Map с обновленными значениями.
3. Set:

JavaScript

```
const mySet = new Set([1, 2, 3, 4, 5]);
mySet.forEach((value) => {
  console.log(value);
});
// 1
// 2
// 3
// 4
// 5
```
В этом примере:

forEach – метод объекта Set, который применяется к каждому значению в объекте Set и не возвращает значения.
(value) – функция обратного вызова, которая принимает один аргумент value, представляющий текущее значение в объекте Set.
console.log – используется для отображения значения.
Пример использования функции обратного вызова для indexOf():
JavaScript

```

const numbers = [1, 2, 3, 4, 5];
const firstEvenIndex = numbers.indexOf((number) => number % 2 === 0);
console.log(firstEvenIndex); // 1
```
В этом примере:

indexOf – метод массива, который ищет первый элемент, соответствующий заданному условию, и возвращает его индекс.
(number) – функция обратного вызова, которая принимает один аргумент number, представляющий текущий элемент массива.
number % 2 === 0 – выражение, которое проверяет, является ли number четным числом.
firstEvenIndex – переменная, которая хранит индекс первого четного числа в массиве numbers.