在异步函数中返回Observable

时间:2019-03-14 18:32:16

标签: angular http asynchronous observable

我从服务器获取的数据有麻烦。我需要检查用户名是否可用,然后执行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 个答案:

答案 0 :(得分:1)

需要返回一个Observable吗?首先不要订阅而不是订阅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
        }
    })
)

答案 1 :(得分:0)

基本上,您需要将第一个http调用返回的可观察值展平,然后根据某些逻辑切换到下一个http调用(filter可以帮助您)。 switchMap是可以为您提供帮助的运营商之一,它被认为是mergeMap的更安全的默认设置,并且仅维护一个内部订阅(就像您的情况一样)。我为您创建了一个StackBlitz演示。