Angular 6 - проблема с выполнением вложенной функции .subscribe () «next» - PullRequest
0 голосов
/ 15 сентября 2018

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

register.component.ts

registerUser(email: String, password: String) {
  let found = false;
  this.authService.findUser(email).pipe(
    tap(res => { console.log(res.status);
      if (res.status === 202) { found = true; } else if (res.status === 200) { found = false; } else {found = null; }}),
    concatMap(res => {
      console.log(found);
      if (found) {
        this.snackBar.open('E-mail already taken.', 'Ok', { duration: 3000 });
      } else if (!found) {
        this.authService.registerUser(email, password).subscribe(res2 => {
          /* CODE DOES NOT EXECUTE - START */
          console.log(res2.status);
          if (res2.status === 201) {
            this.router.navigate(['/list']);
          } else {
            this.snackBar.open('Unable to add new user.', 'Try later', { duration: 3000 });
          }
          /* CODE DOES NOT EXECUTE - END*/
        });
      } else {
        this.snackBar.open('Checking e-mail address failed.', 'Try later', { duration: 3000 });
      }
      return of(res);
    })
  ).subscribe();
}

Пользователь зарегистрирован правильно, ноотмеченный код не выполняется. В AuthService - {Наблюдение: 'ответ'} добавляется к запросам get (findUser) и post (registerUser).

1 Ответ

0 голосов
/ 15 сентября 2018

Вы не должны подписываться на внутреннюю наблюдаемую, правильный подход состоит в том, чтобы объединить наблюдаемые только в одну и подписаться на нее:

registerUser(email: String, password: String) {
  this.authService.findUser(email)
    .pipe(
      flatMap(res => {
        let found = null;

        if (res.status === 202) {
          found = true;
        } else if (res.status === 200) {
          found = false;
        }

        console.log(found);

        if (found) {
          this.snackBar.open('E-mail already taken.', 'Ok', { duration: 3000 });

          return of(res);
        }

        return this.authService.registerUser(email, password);
      }),
    )
    .subscribe(res2 => {
      console.log(res2.status);
      if (res2.status === 201) {
        this.router.navigate(['/list']);
      } else {
        this.snackBar.open('Unable to add new user.', 'Try later', { duration: 3000 });
      }
    });
}

Обратите внимание, что я также упростил ваш код, нет необходимости в tap и concatMap. Другое дело, что условие для found и !found - третья ветка else никогда не может быть выполнена, поэтому я также удалил это.

https://www.learnrxjs.io/operators/transformation/mergemap.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...