Я ладья ie в rx js, и я пытаюсь выяснить, что произошло, в следующем коде.
Действительно, чтобы проиллюстрировать идею, я подготовил два простые обещания (resolvePromise и rejectPromise), одно разрешает обещание, а другое отклоняет. Экземпляр «Subject» используется для запуска этих двух обещаний (передаваемых по конвейеру с помощью mergeMap и forkJoin). В конце добавляются две отдельные инструкции (источник $ .next ('xxx')) в надежде активировать подписку дважды.
Но, наконец, только первый «source $ .next ('1') "запускает подписку, а следующий" source $ .next ('2') ", кажется, ничего не делает.
Я предполагаю, что такое поведение вызвано обещанием отклонить, которое буквально« выдает исключение ». Но мне интересно, как я могу исправить этот код, чтобы второй «source $ .next ('2')» также запускал подписку.
Большое спасибо
import { of,forkJoin,Subject } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const resolvePromise = val =>
new Promise(resolve => resolve(`resolve value: ${val}`));
const rejectPromise = err =>
Promise.reject(`reject error: ${err}`);
const source$ = new Subject();
source$
.pipe(mergeMap(val => {
return forkJoin([
resolvePromise(val),
rejectPromise(val)
]);
}))
.subscribe(
console.log,
console.error
);
source$.next('1');
source$.next('2');
Обновление
Основываясь на предложении Андрея Гатея ниже, чтобы решить эту проблему, я решил передать catchError после forkJoin и поместить обработку ошибок внутри.
source$.pipe(
mergeMap(val => {
return forkJoin([
resolvePromise(val),
rejectPromise(val)
])
.pipe(
catchError(err => {
// your error handling business logic
console.error(err);
return empty();
})
);
}))
.subscribe(console.log);