Значение доступа в завершенной подписке

#rxjs

Вопрос:

Я подписываюсь на Наблюдаемое следующим образом:

     this.service.post(request).subscribe(
        
        (value: Response> => { 

          // Do something with value

        },

        (error) => {
          this.state = State.Invalid;
          // Show errors on page
        },

        () => { 
          this.state = State.Completed;

          // Redirect to new page:
          this.router.navigate(['done'], { state: { v: value } });
        }

      );
 

В основном я отправляю запрос в API, а затем мне нужно:

  1. Сделайте что-нибудь с возвращенным значением;
  2. Показывать ошибки при наличии ошибки
  3. Перенаправление на новую страницу после обработки возвращенного значения.

Как получить доступ к значению в завершено? Вот почему мне нужно получить к нему доступ:

       this.router.navigate(['done'], { state: { v: value } });

 

Должен ли я переместить эту строку в next функцию?

    (value: Response> => { 

     // Do something with value
     // Redirect here

   }
 

Комментарии:

1. Когда вы подписываетесь на observable, вы получаете поток нулевых или более значений с помощью обратного вызова «следующий». Полный обратный вызов наблюдаемого объекта не имеет значения. К какой ценности вы пытаетесь получить доступ?

2. Я сделал свой вопрос более ясным с обновлением … Помогает ли это?

3. Да, вы можете переместить его в next обратный вызов, который будет вызван только в том случае, если ошибки нет.

Ответ №1:

Вы не можете сделать это complete непосредственно в обратном вызове, потому что для этого требуется ноль аргументов.

Если вы хотите получить доступ к значению как после УСПЕШНОГО, так и после ОШИБКИ, вы можете использовать RxJS операторы, такие как:

 this.service
  .post(request)
  .pipe(
    tap((value: Response) => {
      // do something with the Response value here
    }),
    catchError((err) => {
      // catch the error here, and return observable of anything that refer to an error not to the Response value.
      return of('ANYTHING_REFER_TO_ERROR');
    })
  )
  .subscribe((value: Response | string) => {
    // Here you can access the value,
    // which will be the Response value if there is no error,
    // or the value your returned from catchError.
  });
 

Комментарии:

1. завершение вызывается после того, как наблюдаемое состояние выполнено УСПЕШНО или ОШИБОЧНО? Я думал, что это будет только после СЛЕДУЮЩЕГО

2. Извини, я виноват. Я обновил свой ответ, чтобы включить решение, использующее RxJS только операторов. Спасибо.