Программная инжененрия для JavaScript, TypeScrip, Node.js
👉 Group: https://t.me/How_Programming_Works
👉 Node.js channel: https://t.me/metarhia
👉 Node.js group: https://t.me/nodeua
Post #1557
6.11K

Обновленный роадмап
- 🔥 35
- 👍 13
- ❤ 4
HO @howprogrammingworks
Showing posts older than #1559 · Back to latest

Forwarded from Node.js Ukraine Community
YouTube ✨ Асинхронное программирование на JavaScript и Node.js в 2024 ✨ 👉 Описание курса Async 2024: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Async-2024.md 👉 Старый курс по асинхронности: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/Asynchronous.md 👉 Node.js 2024 описание курса: …Forwarded from Asynchronous Programming

Forwarded from Node.js Ukraine Community
Forwarded from Node.js Ukraine Community
Forwarded from Node.js Ukraine Community
Forwarded from Node.js Ukraine Community

Collector:AbortControllersetTimeout теперь AbortSignal.timeoutAbortSignal.any для объединения двух сигналовconst dc = collect(['key1', 'key2', 'key3', 'key4'], { timeout: 1000 });
const opt = { signal: dc.signal };
dc.take('key1', fs.readFile, 'README.md', opt);
dc.wait('key2', fs.promises.readFile, 'README.md', opt);
const url = 'http://worldtimeapi.org/api/timezone/Europe';
dc.wait('key3', (await fetch(url, opt)).json());
setTimeout(() => dc.set('key4', 'value4'), 50);
try {
const result = await dc;
console.log(result);
} catch (err) {
console.log(err);
}const controller = new AbortController();
const opt = { signal: controller.signal };
const timeout = new Promise((resolve, reject) => {
setTimeout(() => {
controller.abort();
reject(new Error('Timed out'));
}, 1000);
});
const promise1 = new Promise((resolve, reject) => {
fs.readFile('README.md', opt, (err, data) => {
if (err) return void reject(err);
resolve(data);
});
});
const promise2 = fs.promises.readFile('README.md', opt);
const url = 'http://worldtimeapi.org/api/timezone/Europe';
const promise3 = (await fetch(url)).json();
const promise4 = new Promise((resolve) => {
const timer = setTimeout(() => {
resolve('value4');
}, 50);
controller.signal.addEventListener('abort', () => {
clearTimeout(timer);
});
});
const data = Promise.allSettled([promise1, promise2, promise3, promise4]);
try {
const keys = await Promise.race([data, timeout]);
const [key1, key2, key3, key4] = keys.map(({ value }) => value);
const result = { key1, key2, key3, key4 };
console.log(result);
} catch (err) {
console.log(err);
}



Collector, имеющая интерфейс EventEmitter, ее можно так же ждать как Thenable (Promise-like) через await и она умеет собирать данные из асинхронных функций с разными контрактами, делать таймауты и обрабатывать ошибки. В общем, это универсальная штука, позволяющая делать код более простым и надежным. Посмотрите ее код, он очень маленький и понятный: https://github.com/metarhia/metautil