Труба RxJS не вызывается с молнией - PullRequest
0 голосов
/ 01 июня 2018

Я заархивировал три наблюдаемые, каждая из трех наблюдаемых имеет свой собственный обратный вызов «success», используя .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 ]

0 голосов
/ 01 июня 2018

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

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

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

0 голосов
/ 03 июня 2018

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

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

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

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

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>
0 голосов
/ 01 июня 2018

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

request1.pipe(tap(() => {
    //Unique success callback I want to run if request2 succeeds.
    //It should still run if request1 fails
}),
    catchError(// Error occured)
);
...