#typescript #rxjs #event-handling
Вопрос:
Я использую TypeScript, и в своем проекте я использую rxjs/Subject для сообщений о событиях.
Вот пример:
class Downloader {
const done = new Subject();
download(): Promise<void> {
return downloadSomeFile(...)
.then(() => {
done.next();
});
}
}
И где-то еще в моем проекте я просто подписываюсь на него:
done.subscribe(() => { /* do something fancy */ });
Это технически возможно, но я читал, что это не входит в дизайнерскую идею rxjs
и вместо этого использовать непосредственно наблюдаемое. Почему это так и как бы выглядел мой фрагмент кода при правильной реализации?
Комментарии:
1. В функции, в которой это вызывается, вы возвращаете обещание DownloadsomeFile() или выполненное. Как наблюдаемый(). Как некоторые другие участники проекта получат доступ к «готово»?
2. У меня есть класс менеджера загрузок, и
done
я являюсь его членом. Тогда несколько пользователей моего приложения смогут подписаться наSubject
3. есть ли причина, по которой они подписываются на done, а не на обещание » загрузить ()», также выполненное в вашем вопросе, является частной переменной
4. Да, потому что у меня есть 1 абонент и много других мест, которые влияют на это. Только один может позвонить
download()
Ответ №1:
Участник должен иметь возможность подписаться на это только как на наблюдаемое и не должен иметь возможности запускать next
извне. Знание subscription
того, что одновременно произойдет несколько событий, subject
является лучшим выбором.
class Downloader {
private _done = new Subject(); // for triggering next
public done = _done.asObservable(); // for subscribers as Observable
public download(): Promise<void> {
return downloadSomeFile(...)
.then(() => {
this._done.next();
});
}
}