Я предполагаю, что вы используете хотя бы Rxjs версии 5.5, в которой введены конвейерные операторы . Из документов - к ним можно "... получить доступ в rxjs / operator (обратите внимание на множественные" операторы "). Они предназначены для того, чтобы лучше подходить для добавления именно тех операторов, которые вам нужны, чем" патч "операторы найдены в rxjs / add / operator /*."
Если вы не используете конвейерные операторы, вместо того, чтобы передавать операторы на pipe()
, как я это делал ниже, вы можете объединить их в цепочку, используя обозначение точки, которое вы используете в своем примере.
Я предлагаю обратиться к learnrxjs.io для получения дополнительной информации об операторах в RxJS в сочетании с примерами.
Команда RxJS также создала справочную документацию BETA .
Объяснение
Я предположил, что первый filter
получает ответ и фильтрует по ответу. Идентификатор вместо data.Id . Если это не опечатка, фильтр можно оставить прежним.
Я добавил дополнительную строку между операторами только для представления.
mergeMap - это оператор, который принимает функцию, которая возвращает Observable, на который он автоматически подпишется. Я возвращаю of () здесь, что создает Observable, который просто излучает предоставленное ему значение.
catch было переименовано в catchError в RxJS 5.5 , также были добавлены конвейерные операторы, добавляющие поддержку оператора .pipe()
.
Если вы не хотите ничего делать, кроме регистрации ошибки, вы можете вернуть empty () , что немедленно вызовет complete()
для источника Observable, ничего не испуская. EMPTY предпочтительнее, если вы используете версию 6.
Необязательно: Вместо использования filter()
и затем take(1)
, вы можете использовать оператор first () , который возвращает логическое значение, аналогично filter()
, и отписывается от источника Наблюдаемый после того, как он возвращает true
один раз.
import {EMPTY, of} from 'rxjs';
import {catchError, filter, take, mergeMap, timeout} from 'rxjs/operators';
const resultPromise = service.data.pipe(
// I assumed you meant response.Id, instead of data.Id
filter((response: dataResponseMessage) => response.Id === 'dataResponse'),
take(1),
// mergeMap accepts a value emitted from the source Observable, and expects an Observable to be returned, which it subscribes to
mergeMap((response: dataResponseMessage) => {
if (response.Values.Success) {
return of('Success!!');
}
return of('Not Success');
}),
timeout(timeoutInMilliseconds),
// catch was renamed to catchError in version 5.5.0
catchError((error) => {
console.log(error);
return EMPTY; // The 'complete' handler will be called. This is a static property on Observable
// return empty(); might be what you need, depending on version.
})
).toPromise();