#typescript #promise #rxjs #observable #rxjs7
Вопрос:
У меня есть следующий вспомогательный оператор rxjs:
import { share } from 'rxjs/operators'; export const shareResetOnError = lt;Tgt;() =gt; sharelt;Tgt;({ resetOnError: true, resetOnComplete: false });
У меня также есть следующая спецификация для этого оператора:
import { Observable } from 'rxjs'; import { shareResetOnError } from './rxjs'; fdescribe('shareResetOnError', () =gt; { it('should share last emitted value', async () =gt; { const expectedValue = 123; let count = 0; const observable = new Observable(subscriber =gt; { count ; subscriber.next(-expectedValue); subscriber.next(expectedValue); subscriber.complete(); }).pipe(shareResetOnError()); for (let i = 0; i lt; 3; i ) { await expectAsync(observable.toPromise()).toBeResolvedTo(expectedValue); } expect(count).toBe(1); }); it('should reset value on error', async () =gt; { const expectedError = new Error('test'); const expectedValue = 123; let expectError = true; let errorsCount = 0; let valuesCount = 0; const observable = new Observable(subscriber =gt; { if (expectError) { errorsCount ; subscriber.error(expectedError); } else { valuesCount ; subscriber.next(expectedValue); } subscriber.complete(); }).pipe(shareResetOnError()); for (let i = 0; i lt; 4; i ) { await expectAsync(observable.toPromise()).toBeRejectedWithError(expectedError.message); } expect(errorsCount).toBe(4); expectError = false; for (let i = 0; i lt; 3; i ) { await expectAsync(observable.toPromise()).toBeResolvedTo(expectedValue); } expect(valuesCount).toBe(1); }); });
По какой-то причине expectAsync(observable.toPromise()).toBeResolvedTo(expectedValue)
происходит сбой, потому observable
что вместо этого разрешено значение undefined expectedValue
. Я также пробовал lastValueFrom
вместо toPromise
этого, но это не имеет никакого значения. Перед переключением с rxjs 6 на 7 у меня было следующее определение для shareResetOnError
:
import { AsyncSubject, ConnectableObservable, Observable, pipe, Subscription } from 'rxjs'; import { refCount } from 'rxjs/operators'; function publishLastResetOnErrorlt;Tgt;() { return (source: Observablelt;Tgt;) =gt; { let subject: AsyncSubjectlt;Tgt;; let subscription: Subscription; resetSubject(); return new ConnectableObservable(source, () =gt; subject); function resetSubject() { subscription?.unsubscribe(); subject = new AsyncSubjectlt;Tgt;(); subscription = subject.subscribe({ error: resetSubject }); } }; } export const shareResetOnError = lt;Tgt;() =gt; pipe(publishLastResetOnErrorlt;Tgt;(), refCount());
It was working as expected and spec wasn’t failing. Why observable.toPromise()
is not resolved to expected value with rxjs 7 operator?