Skip to content

Commit e1341cb

Browse files
committed
[REC-10/st-compl] higher-order-functions, 2-nd
Solving 4 tasks. Working with "callbacks, err pattern, for...of()". Worth noting: - all this tasks (note the solutions). FS-dev: B-3 / JS basic
1 parent e46d64e commit e1341cb

File tree

2 files changed

+102
-0
lines changed
  • full-stack-dev/3-js-basic/10-higher-order-functions/recall

2 files changed

+102
-0
lines changed

full-stack-dev/3-js-basic/10-higher-order-functions/recall/recall.js renamed to full-stack-dev/3-js-basic/10-higher-order-functions/recall/1-first/recall.js

File renamed without changes.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Напишите функцию filterArray(arr, callback).
5+
// 1. Она должна принимать массив arr и callback-функцию.
6+
// 2. callback принимает один элемент массива и возвращает true, если элемент "хороший", и false, если он "плохой".
7+
// 3. Ваша функция filterArray должна вернуть новый массив, содержащий только "хорошие" элементы.
8+
// 3. Ограничение: Не используйте встроенный .filter(). Используйте цикл (например, for...of).
9+
10+
const numbers = [1, 2, 3, 4, 5];
11+
const isEven = (num) => num % 2 === 0;
12+
13+
function filterArray(arr = [], callback) {
14+
if (!arr) {
15+
return [];
16+
}
17+
18+
const evenArr = [];
19+
20+
for (const num of arr) {
21+
if (callback(num)) {
22+
evenArr.push(num);
23+
}
24+
}
25+
26+
return evenArr;
27+
}
28+
29+
console.log(filterArray(numbers, isEven)); // [2, 4]
30+
31+
// Задание 2:
32+
// Напишите функцию-фабрику createMultiplier(factor).
33+
// 1. Она должна принимать один аргумент factor (число-множитель).
34+
// 2. Она должна возвращать новую функцию.
35+
// 3. Эта новая функция, в свою очередь, должна принимать один аргумент number (число).
36+
// 4. При вызове новая функция должна возвращать результат умножения number на factor, который она "запомнила".
37+
38+
function createMultiplier(factor) {
39+
if (!factor || typeof factor !== 'number') {
40+
return () => {}; // или null можно вернуть.. но НЕ NaN как я хотел, т.к. идёт возврат функций
41+
}
42+
43+
return (number) => {
44+
if (!number || typeof number !== 'number') {
45+
return () => {}; // или null можно вернуть.. но НЕ NaN как я хотел, т.к. идёт возврат функций
46+
}
47+
48+
return number * factor;
49+
};
50+
}
51+
52+
const multiplyByFive = createMultiplier(5);
53+
54+
console.log(multiplyByFive(10)); // 50
55+
console.log(multiplyByFive(3)); // 15
56+
console.log(createMultiplier(2)(8)); // 16
57+
58+
// Задание 3:
59+
// Давайте объединим то, что мы только что сделали, со встроенными функциями высшего порядка. Это очень распространенный паттерн (как arr.filter(inBetween(3, 6)) в вашем уроке ).
60+
// 1. Возьмите вашу функцию createMultiplier(factor) из предыдущей задачи.
61+
// 2. Создайте массив const numbers = [10, 20, 30];.
62+
// 3. Создайте "специализированную" функцию const triple = createMultiplier(3);.
63+
// 4. Теперь, используя метод .map() и передав ему напрямую вашу функцию triple, получите новый массив, в котором каждое число утроено.
64+
65+
const arr = [10, 20, 30];
66+
const triple = createMultiplier(3);
67+
68+
const tripleArr = arr.map(triple);
69+
console.log(tripleArr); // [30, 60, 90]
70+
71+
// Задание 4:
72+
// Напишите функцию fetchUserData(callback), которая имитирует запрос на сервер:
73+
// 1. Она принимает callback-функцию.
74+
// 2. Внутри она должна сгенерировать const randomNum = Math.random();.
75+
// 3. Имитируйте задержку в 1 секунду с помощью setTimeout.
76+
// 4. Логика внутри setTimeout:
77+
// - Успех: Если randomNum > 0.5, вызовите callback, передав null (для ошибки) и "успешные" данные (например, { name: 'Alice', id: 1 }).
78+
// - Ошибка: Если randomNum <= 0.5 (используйте else для надежности!), вызовите callback, передав new Error('Server error') (для ошибки) и null (для данных).
79+
// 5. Вызов: Вызовите fetchUserData и передайте ей колбэк, который правильно обрабатывает оба случая ("Error-first"):
80+
// - Если err есть, он должен вывести в консоль сообщение об ошибке (например, err.message).
81+
// - Если err нет, он должен вывести в консоль полученные data.
82+
// Подсказка: Вспомните, как выглядел outputData(err, data) в вашем уроке 10.2 .
83+
84+
function fetchUserData(callback) {
85+
const randomNum = Math.random();
86+
87+
setTimeout(() => {
88+
if (randomNum > 0.5) {
89+
callback(null, { name: 'Alice', id: 1 });
90+
} else {
91+
callback(new Error('Server error'), null);
92+
}
93+
}, 1000);
94+
}
95+
96+
fetchUserData((err, data) => {
97+
if (err) {
98+
console.error(err.message);
99+
} else {
100+
console.log(data); // можно и без else блока.. просто console.log(data);
101+
}
102+
});

0 commit comments

Comments
 (0)