Що робить once()?
1. Що робить once()
Метод
.once(eventName, listener)реєструє обробник події, який виконається лише один раз, а потім автоматично видалиться.
Після першого виклику події - слухач більше не буде викликатися, навіть якщо подія з тим самим іменем відбудеться знову.
Приклад:
javascript
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.once('connect', () => {
console.log('З'єднання встановлено!');
});
emitter.emit('connect'); // спрацює
emitter.emit('connect'); // більше не спрацюєВивід:
javascript
З'єднання встановлено!2. Що робить on()
Метод
.on(eventName, listener)реєструє постійний обробник події. Він буде викликатися щоразу, коли подія генерується.
Приклад:
javascript
emitter.on('data', () => {
console.log('Отримано дані');
});
emitter.emit('data'); // спрацює
emitter.emit('data'); // знову спрацюєВивід:
javascript
Отримано дані
Отримано дані3. Головна відмінність між once() і on()
| Характеристика | on() | once() |
|---|---|---|
| Кількість спрацьовувань | Необмежено (щоразу при emit()) | Лише один раз |
| Чи потрібно вручну видаляти слухача | Так, за потреби (off()) | Ні, видаляється автоматично |
| Типові випадки використання | Повторювані події (наприклад, data, message) | Одноразові події (connect, ready, close, finish) |
| Вплив на пам'ять | Слухач залишається | Слухач видаляється після виклику |
4. Чому once() корисний
- Уникає витоків пам'яті - слухач видаляється автоматично.
- Зручний для ініціалізацій - наприклад, подія
readyу сервера чиopenу потоку. - Спрощує логіку - не потрібно вручну викликати
.off().
5. Приклад з реальної практики
Наприклад, у HTTP-сервера:
javascript
const http = require('http');
const server = http.createServer();
server.once('listening', () => {
console.log('Сервер запущено!');
});
server.listen(3000);Подія 'listening' має відбутися один раз -
тому .once() ідеально підходить.
Підсумок
on()- додає постійного слухача, який викликається щоразу приemit().once()- додає одноразового слухача, який видаляється після першого виклику.Рекомендується:
- використовувати
on()для повторюваних подій (data,message,update);- використовувати
once()для одноразових подій (connect,ready,close,init).
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.