Наблюдаемый с событиями

Я читаю руководство по Angular.io, и в главе Observables я встретил этот фрагмент:

Создание с помощью настраиваемой функции fromEvent

function fromEvent(target, eventName) {
  return new Observable((observer) => {
    const handler = (e) => observer.next(e);

    // Add the event handler to the target
    target.addEventListener(eventName, handler);

    return () => {
      // Detach the event handler from the target
      target.removeEventListener(eventName, handler);
    };
  });
}

Использовать настраиваемую функцию fromEvent

const ESC_KEY = 27;
const nameInput = document.getElementById('name') as HTMLInputElement;

const subscription = fromEvent(nameInput, 'keydown')
  .subscribe((e: KeyboardEvent) => {
    if (e.keyCode === ESC_KEY) {
      nameInput.value = '';
    }
  });

Я знаю, что Observable - это объект, который использует функцию (подписчик) для вызова объекта с помощью методов для обработки передаваемых значений (наблюдатель).

Но в этом примере я не понимаю как передается переменная 'e' и то, как работает поток выполнения. Может кто-нибудь помочь мне понять это?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 312
3

Ответы 3

Это синтаксис ES6.

// ES6
const handler = (e) => observer.next(e);

// Equals to
const handler = function(e) {
    return observer.next
}

document.addEventListener принимает название события и само событие:

target.addEventListener(type, listener[, options]);

target.addEventListener(type, listener[, useCapture]);

target.addEventListener(type, listener[, useCapture, wantsUntrusted ]); // Gecko/Mozilla only

type

A case-sensitive string representing the event type to listen for.

listener

The object which receives a notification (an object that implements the Event interface) when an event of the specified type occurs. This must be an object implementing the EventListener interface, or a JavaScript function. See The event listener callback for details on the callback itself.

Подробнее об этом читайте в Веб-документы MDN.

Параметр 'e' в некотором смысле вызывается за рамками этого примера. Это параметр функции с именем «обработчик». Когда «обработчик» используется другой функцией, в данном случае addEventListener или removeEventListener, ему в этот момент будет предоставлен параметр, который будет представлять «e».

может быть яснее вот так:

function fromEvent(target, eventName) {
  return new Observable((observer) => {

    // Add the event handler to the target
    target.addEventListener(eventName, (e) => {
      // when event listener fires, call next on the observer with the event
      // this sends the event to subscribers of the observable
      observer.next(e)
    });

    return () => {
      // clearly this doesn't work anymore as you have no reference to the handler
      // so this creates a memory leak
      // target.removeEventListener(eventName, handler);
    };
  });
}

Другие вопросы по теме