Rxjs задерживает подписку на тему пожара после завершения - PullRequest
0 голосов
/ 26 сентября 2019

Я создал этот пример, чтобы продемонстрировать проблему: https://stackblitz.com/edit/rxjs-vxvmq1?file=index.ts&devtoolsheight=100

По сути, я хочу вызвать функцию (например, cleanup, как в примере), когда тема завершена.Эта функция вызывается другими пользователями, поэтому они не подписываются на изменения субъекта. Вместо этого существует подписка, которая запускает функцию завершения субъекта.Функция проверяет, должна ли она выполнять дополнительную работу после завершения объекта, поэтому она проверяет, остановился ли объект или нет.Но кажется, что после вызова next() функция запускается до вызова complete(), заставляя функцию думать, что субъект еще не завершен.

Интересно, есть ли способ решить эту проблему??Вызов complete() сначала, потом next() не помог, так как next() не уведомил подписку после завершения темы.

1 Ответ

1 голос
/ 26 сентября 2019

Короче говоря.Это все неправильно.

Исправлено # 1, а не rxjs-idiomatic: вы подписываетесь неправильно: вы передаете onNext обратный вызов, пока вас интересует onComplete.subscribe принимает * три параметра: onNext, onError, onComplete, и вы несете ответственность за выбор того, что вам действительно нужно.

Fix # 2, rxjs-idiomaric: вы должны использовать pipe(...) вместе с операторами, определенными в rxjs/operators (AFAIR).Обратите внимание, что также легко определить пользовательский оператор.Таким образом, вы можете использовать finalize(() => ...your cleanup logic goes here) или Observable.create, возвращая логику завершения в качестве реализации unsubscribe.Оба хорошо документированы здесь или здесь .

Кроме того, кажется, что вы неправильно понимаете семантику rxjs.В терминах регулярных выражений его можно определить как next*(error|complete), что буквально означает: ноль или бесконечное число next, за которыми следует либо error, либо complete (исключение или: никогда оба одновременно) ровно один раз.Поэтому не ожидайте, что next сделает что-либо после complete (или равно error).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...