Автосервис Angular 2 с Rxjs

У меня есть компонент формы входа, который имеет следующее:

login.component.ts

ngOnInit() {
    this.authenticationService.loginAttempt
        .subscribe(() => this.onSuccess(), err => this.onError(err));
}

login(credentials) {
    this.authenticationService.attempt(credentials);
}

Моя служба аутентификации в настоящее время выглядит так:

authentication.service.ts

class AuthenticationService {
    loginAttempt = new Observable<>();
    credentials = new Subject<Credentials>();

    constructor(private userService: UserService) {
        this.loginAttempt = this.credentials
            .flatMap(credentials => this.makeLoginRequest(credentials);
    }

    attempt(credentials: Credentials) {
        this.credentials.next(credentials);
    }

    private makeLoginRequest(credentials) {
        return this.userService.getTokens(credentials.email, credentials.password);
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что если попытка входа не удалась, я могу вызвать onError функция на login.component для отображения сообщения об ошибке, но затем последующие попытки входа в систему больше не вызывают запрос входа в систему, потому что loginAttempt была ошибка.

Как я могу поймать ошибку в login.component чтобы я мог отобразить ошибку, в то же время допуская повторные попытки?

Редактировать:

Этот вопрос предлагает использовать retry или же retryWhen, но я не уверен, как включить это на основе того, когда пользователь снова нажимает кнопку входа в систему. Как я могу это сделать (если это правильный подход)?

1 ответ

Что вы делаете, вы загружаете его на ngOnit, поэтому вы загружаете его при загрузке страницы.

После этого вы никогда не перезагрузите его снова. Таким образом, успех остается успехом, а ошибка остается ошибкой.

Поставьте сервисный вызов за кнопкой вызова, и все готово.

редактировать

Изменить:

ngOnInit() {
  this.authenticationService.loginAttempt
    .subscribe(() => this.onSuccess(), err => this.onError(err));
}

В:

buttonClicked() {
  this.authenticationService.loginAttempt
    .subscribe(() => 
      this.onSuccess(), 
      err => this.onError(err)
      );
}
Другие вопросы по тегам