(Я не проверял это сам, но похоже, что он соответствует Chrome API времени выполнения.)
Один из способов, которым ваш нынешний подход может быть чище, - это лучше обобщить создание среды выполнения потоки событий. Использование Субъектов (а также подписка на слушателей в рамках другого вызова для подписки) приводит к усложнению, и обычно излишне.
Этот код устанавливает два экземпляра Observable<Port>
, один из только что подключенных портов и один из только что отключенные порты.
const fromRuntimeEvent = (target, eventType) =>
new Observable((observer) => {
const listener = (event) => observer.next(event);
try {
target[eventType].addListener(listener);
} catch (e) {
observer.error(e);
}
return () => target[eventType].removeListener(listener);
});
const connections$ = fromRuntimeEvent(chrome.runtime, 'onConnect');
const disconnectsFor = (port) => fromRuntimeEvent(port, 'onDisconnect');
const disconnections$ = connections$.pipe(
mergeMap((port) => disconnectsFor(port))
);
Отсюда, использование scan
в том виде, в каком вы уже есть, имеет смысл для меня, просто не забудьте учесть и отключения.