Труба RxJS не вызывается с молнией

Я заархивировал три наблюдаемые, каждая из этих трех имеет свой собственный обратный вызов "успеха", используя .pipe(tap() => {...});, Это прекрасно работает, когда все три наблюдаемые выполняются без ошибок, но если одна из наблюдаемых ошибок выходит из строя, то ни один из методов отвода не выполняется. Как сделать так, чтобы методы tap всегда выполнялись, если эта наблюдаемая выполняется успешно?

var request1 = Observable.create(...);  //Pretend this one will fail (though request2 or request3 could also fail)
var request2 = Observable.create(...);
var request3 = Observable.create(...);

request1.pipe(tap(() => {
    //Unique success callback should always run if request1 succeeds, even if request2 or request 3 fails.
}));

request2.pipe(tap(() => {
    //Unique success callback should always run if request2 succeeds, even if request1 or request 3 fails.
}));

request3.pipe(tap(() => {
    //Unique success callback should always run if request3 succeeds, even if request1 or request 2 fails.
}));

var observable = zip(request1, request2, request3);
observable.subscribe(() => {
    //Do something when all three execute successfully
});

3 ответа

Я считаю, что это ожидаемое и соответствующее поведение для того, с чем вы имеете дело. Вы, вероятно, хотите посмотреть на использование трубопровода catchError давайте в каждый ваш запрос и возвращаем пустую наблюдаемую.

request1.pipe(tap(() => {
    //Unique success callback
}), catchError((err) => {
    return empty();
}));

Таким образом вы справитесь с ошибкой наблюдаемой, не нарушая новую zip,

@MichaelSolati почти правильно, кроме

  • вы должны поймать и вернуть значение, например, null если вы хотите увидеть вывод в subscribe() - потому что почтовый индекс не будет стрелять empty()
  • ваш tap() обратные вызовы не в zip() pipe, они являются отдельными ветками, на которые не подписаны, поэтому никогда не активируются.

Обратите внимание, что с изменениями в версиях rxjs импорт может быть немного сложным, например zip доступен как функция и как оператор.
С rxjs.umd.js cdn, использованный в приведенном ниже фрагменте, я изначально использовал оператор по ошибке, и он не выдает ошибку (но не работает).

Я отмечаю из комментариев выше, что вы делаете это в угловом контексте. Если у вас все еще есть проблема, пожалуйста, опубликуйте свой полный угловой модуль с импортом, и мы сможем решить эту проблему.

console.clear()
//console.log(rxjs)

// Get the operators and creators
const tap = rxjs.operators.tap
const empty = rxjs.empty
const zip = rxjs.zip
const catchError = rxjs.operators.catchError
const of = rxjs.of
const throwError = rxjs.throwError


//var request1 = of(1)
var request1 = throwError('error') 
var request2 = of(2)
var request3 = of(3)

var req1 = request1.pipe(
  tap(() => console.log('request1')),
  catchError((err) => { 
    console.log('request1 has error')
    return of(null) 
  })
);

var req2 = request2.pipe(
  tap(() => { console.log('request2');})
);

var req3 = request3.pipe(
  tap(() => { console.log('request3');})
);

var myObservable = rxjs.zip(req1, req2, req3);
myObservable.subscribe(
  result => { console.log('result', result) }
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.0/rxjs.umd.js"></script>

Добавлять catch блок в вашем коде, где вы можете отслеживать ошибки.

request1.pipe(tap(() => {
    //Unique success callback I want to run if request2 succeeds.
    //It should still run if request1 fails
}),
    catchError(// Error occured)
);
Другие вопросы по тегам