Skip to content

Commit f16c93c

Browse files
committed
[LES-10.2/st-compl] callback-functions
Practice with "callback" funcs. Processing "err", JSON.stringify() meth. Worth noting: - rule/pattern for handling "errors" in callback/asynchronous functions. FS-dev: B-3 / JS basic
1 parent e9e28c5 commit f16c93c

File tree

1 file changed

+83
-0
lines changed
  • full-stack-dev/3-js-basic/10-higher-order-functions/10-2-callback-functions

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Задание 1:
2+
// Начнем с самого простого, чтобы "пощупать" передачу функции как аргумента в синхронном коде.
3+
// Создай функцию calculate(a, b, operation). Она должна принимать:
4+
// 1. Два числа (a и b).
5+
// 2. Колбэк-функцию (operation), которая будет производить над ними математическое действие.
6+
// Внутри calculate должна вызвать колбэк operation, передав ему a и b, а затем вывести результат в консоль в формате: Результат: [число].
7+
// Создай две отдельные функции: add (которая складывает два числа) и multiply (которая их умножает).
8+
// Вызови calculate дважды: один раз с функцией add и второй раз с multiply, чтобы проверить её работу.
9+
10+
function add(a, b) {
11+
return a + b;
12+
}
13+
14+
function multiply(a, b) {
15+
return a * b;
16+
}
17+
18+
function calculate(a, b, operation) {
19+
return operation(a, b);
20+
}
21+
22+
let result = calculate(5, 2, add);
23+
console.log(`Результат: ${result}`); // Результат: 7
24+
25+
result = calculate(5, 2, multiply);
26+
console.log(`Результат: ${result}`); // Результат: 10
27+
28+
// Задание 2:
29+
// Напиши функцию fetchData(callback), которая будет имитировать задержку при получении данных с сервера.
30+
// 1. Функция fetchData принимает один аргумент — колбэк.
31+
// 2. Внутри fetchData используй setTimeout, чтобы создать искусственную задержку в 2 секунды (2000 миллисекунд).
32+
// 3. После того как setTimeout отсчитает 2 секунды, он должен вызвать переданный колбэк.
33+
// 4. В этот колбэк нужно передать объект с данными, например: { name: "Сергей", role: "Админ" }.
34+
// 5. Вызови fetchData и передай ей колбэк, который просто выведет полученные данные в консоль.
35+
36+
function outputData(data) {
37+
console.log(`Получены данные: ${data}`);
38+
}
39+
40+
function fetchData(callback) {
41+
const fetch = { name: 'Сергей', role: 'Админ' };
42+
setTimeout(() => callback(JSON.stringify(fetch)), 2000);
43+
}
44+
45+
fetchData(outputData); // Получены данные: {"name":"Сергей","role":"Админ"}
46+
47+
// Задание 3:
48+
// Модернизируем нашу функцию fetchData, чтобы она могла не только успешно загружать данные, но и "падать" с ошибкой.
49+
// 1. Измени функцию fetchData так, чтобы она имитировала вероятность ошибки:
50+
// - Внутри сгенерируй случайное число от 0 до 1 (Math.random()).
51+
// - Если число > 0.5 (успех): через 2 секунды вызови колбэк, передав ему null первым аргументом и объект с данными ({...}) вторым.
52+
// - Если число <= 0.5 (ошибка): через 2 секунды вызови колбэк, передав ему объект ошибки (new Error("Не удалось загрузить данные")) первым аргументом и null вторым.
53+
// 2. Измени код, который вызывает fetchData. Твой колбэк теперь должен принимать два аргумента (err, data).
54+
// 3. Внутри колбэка сначала проверь, пришла ли ошибка.
55+
// - Если err существует, выведи в консоль сообщение об ошибке.
56+
// - Если err равен null, выведи в консоль полученные данные.
57+
// Запусти код несколько раз, чтобы увидеть оба исхода — и успешный, и ошибочный.
58+
59+
function outputData(err, data) {
60+
if (err) {
61+
console.error(err.message); // НЕ console.log и именно err.message
62+
return; // обязательно нужно остановить выполнение, если есть ошибка
63+
}
64+
65+
console.log(`Получены данные: ${data}`);
66+
}
67+
68+
function fetchData(callback) {
69+
const fetch = { name: 'Сергей', role: 'Админ' };
70+
let randomNum = Math.random();
71+
72+
if (randomNum > 0.5) {
73+
setTimeout(() => callback(null, JSON.stringify(fetch)), 2000);
74+
} else {
75+
setTimeout(
76+
() => callback(new Error('Не удалось загрузить данные!'), null),
77+
2000
78+
);
79+
}
80+
}
81+
82+
fetchData(outputData); // Получены данные: {"name":"Сергей","role":"Админ"}
83+
fetchData(outputData); // Не удалось загрузить данные!

0 commit comments

Comments
 (0)