Как использовать наблюдателя вместо тем для сообщений о событиях в машинописном тексте?

#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();
                    });
            }
        }