rxjs - обработка асинхронных ошибок в finally - PullRequest
0 голосов
/ 28 июня 2018

Мне интересно вызывать асинхронную функцию, когда я отписываюсь от наблюдаемой, однако я не могу обрабатывать ошибки синхронизированным способом после отписки, например, у меня есть следующий фрагмент кода, и ошибка isn не пойман.

const observable = Observable.of(true).finally( async () => {
            throw new Error('what');
        });

        try {
            observable.subscribe().unsubscribe();
        } catch (e) {
            console.log('We did not capture this');
        }

Каковы возможные способы обработки асинхронных ошибок в finally?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я думаю, что есть две проблемы:

  1. Вызов unsubscribe() ничего не сделает, потому что of(true) немедленно отправляет уведомление next и complete о подписке. Поэтому, когда вы звоните unsubscribe() самостоятельно, вы уже отписались из-за уведомления complete. Тогда фактический вызов unsubscribe() ничего не сделает в этом случае.

  2. Когда вы помечаете метод как async, это означает, что вы фактически возвращаете обещание, которое было отклонено. Но .finally ожидает функцию, которую она вызывает, и ничего не делает со своим возвращаемым значением. Когда вы помечаете его как async, он возвращает Обещание, но никто его не слушает.

0 голосов
/ 28 июня 2018

Если вы хотите отловить ошибку, вам придется удалить ключевое слово async,

const observable = Observable.of(true).finally(() => {
            throw new Error('what');
        });

с помощью асинхронного преобразования оно превратится в асинхронную функцию и не будет перехвачено. То, что вы делаете сейчас, похоже на

    try {        
        setTimeout(()=> {throw new Error('what');},10)
    } catch (e) {
        console.log('We did not capture this');
    }

Бросок будет выполнен из-за цикла событий вместо основного потока.

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