rxjs — «поделиться» работает не так, как ожидалось

#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?