Возврат наблюдаемый в асинхронной функции - PullRequest
0 голосов
/ 14 марта 2019

У меня проблемы с данными, полученными с сервера. Мне нужно проверить, доступно ли имя пользователя, и затем выполнить http.get, это не проблема, мне нужно вернуть содержимое http.get как наблюдаемое, чтобы создать объект позже.

registerUser(user: RegisterComponent): Observable<any> {

  let headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');

  let exists = this.http.get(this.url + "verifyCuentaUsuarioApp.php?cuenta=" + user.cuentaUser + "&id=" + user.passUser);

  exists.subscribe(response => {
    if (response != null) {
      //console.log("this is the message "+response.mensaje);
      if (response.data[0].estatus == "0") {
        console.log("disponible");
        //I need the content of this request to be returned 
        this.http.get(this.url + 'registroClienteApp.php?' + params, { headers: headers });
      } else
        console.log("no disponible");
    }
  });

  return this.http.get(this.url + 'registroClienteApp.php?' + params, { headers: headers });
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Нужно вернуть наблюдаемый? Начните не с того, что не подписывайтесь, а передавайте Observable по трубопроводу и используйте любой из операторов сглаживания rxjs, например:

this.http.get(// first request here).pipe(
    mergeMap((dataFromFirstRequest) => {
        if (dataFromFirstRequest suits requirement for second request) {
            return this.http.get(// second http request)
        } else {
            return of(false);   // return a falsy data indicating second request wasn't needed
        }
    })
)
0 голосов
/ 14 марта 2019

Как правило, вам нужно сгладить наблюдаемую информацию, возвращаемую первым http-вызовом, а затем переключиться на следующий http-вызов в зависимости от некоторой логики (filter может помочь вам в этом). Один из операторов, который может вам помочь, это switchMap, который считается более безопасным по умолчанию, чем mergeMap, и поддерживает только одну внутреннюю подписку (как в вашем случае). Я создал для вас демо StackBlitz .

...