Javascript 角度-Observable无法正常工作

Javascript 角度-Observable无法正常工作,javascript,angular,typescript,Javascript,Angular,Typescript,我有以下代码工作不正常 我有一个服务,为用户提供注册 register(firstname: string, lastname: string, email: string, password: string): Observable<boolean> { let body = {firstname: firstname, lastname: lastname, email: email, password: password}; this.http.post(th

我有以下代码工作不正常

我有一个服务,为用户提供注册

register(firstname: string, lastname: string, email: string, password: string): Observable<boolean> {
    let body = {firstname: firstname, lastname: lastname, email: email, password: password};

    this.http.post(this.base_url + "api/register/user/", body)
    .subscribe(
        (data) => {
            if((data as any).status == 'success') {
                return Observable.of(true);
            }
        },
        (error) => {
           return Observable.of(false);
    });
    return Observable.of(false);
  }
我还导入了必要的模块:

import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
isRegister保持为false,因此页面不会重定向到主页

有人知道问题出在哪里吗

提前谢谢你

isRegistered值将始终为false,因为您将异步操作视为同步操作。基本上,在您从服务中获得价值之前,将运行isRegistered检查。为了避免这种情况,您必须将检查移到订阅成功回调中:

this.userService
  .register(firstname, lastname, email, password)
  .subscribe(isRegistered => {
    if (isRegistered) {
      this.router.navigate(["/home"]);
      return true;
    } else {
      return false;
    }
  });
通过这种方式,您将确保isRegistered的值已由服务调用的结果设置

您的register函数也有一个缺陷-您总是返回一个可观察的false。您可能希望返回HTTP请求的结果。您应该将HTTP响应的结果映射到布尔值,并在使用服务时订阅

register(firstname: string, lastname: string, email: string, password: string): Observable<boolean> {
  const body = { firstname, lastname, email, password };

  return this.http.post(this.base_url + 'api/register/user/', body)
    .map(data => {
        if((data as any).status === 'success') {
            return Observable.of(true);
        } else {
            return Observable.of(false);
        }
    })
    .catch(() => Observable.of(false));
}
isRegistered值将始终为false,因为您将异步操作视为同步操作。基本上,在您从服务中获得价值之前,将运行isRegistered检查。为了避免这种情况,您必须将检查移到订阅成功回调中:

this.userService
  .register(firstname, lastname, email, password)
  .subscribe(isRegistered => {
    if (isRegistered) {
      this.router.navigate(["/home"]);
      return true;
    } else {
      return false;
    }
  });
通过这种方式,您将确保isRegistered的值已由服务调用的结果设置

您的register函数也有一个缺陷-您总是返回一个可观察的false。您可能希望返回HTTP请求的结果。您应该将HTTP响应的结果映射到布尔值,并在使用服务时订阅

register(firstname: string, lastname: string, email: string, password: string): Observable<boolean> {
  const body = { firstname, lastname, email, password };

  return this.http.post(this.base_url + 'api/register/user/', body)
    .map(data => {
        if((data as any).status === 'success') {
            return Observable.of(true);
        } else {
            return Observable.of(false);
        }
    })
    .catch(() => Observable.of(false));
}

谢谢你的回答!这种方法现在还有一个问题,http没有在服务中发出任何请求。我收到以下错误:未知url的Http失败响应:0未知错误。此错误不能由我的更改引起,因为我没有以任何方式更改传递给服务的参数。你能分享更多的注册用户代码吗?同时检查以下答案:-您可能有CORS问题。registerUser方法只接受电子邮件、密码等。。。从html。你能看看我上面发布的UserService的register方法吗。您现在知道我如何发出http post请求的更好方法了吗?或者该方法还可以吗?我进行了编辑,因为我发现了您的注册函数中的一个缺陷。但是,HTTP调用看起来是正确的。我唯一能想到的是this.base_url值是否为无效url。你能分享一下吗?你的服务器可能与ng serve提供的Angular应用程序位于不同的端口。如果是这样的话,我相信这是一个CORS问题,因为对于浏览器来说,localhost:5001和localhost:{OTHER_PORT}是不同的来源,不管它们在同一台机器上。谢谢你的回答!这种方法现在还有一个问题,http没有在服务中发出任何请求。我收到以下错误:未知url的Http失败响应:0未知错误。此错误不能由我的更改引起,因为我没有以任何方式更改传递给服务的参数。你能分享更多的注册用户代码吗?同时检查以下答案:-您可能有CORS问题。registerUser方法只接受电子邮件、密码等。。。从html。你能看看我上面发布的UserService的register方法吗。您现在知道我如何发出http post请求的更好方法了吗?或者该方法还可以吗?我进行了编辑,因为我发现了您的注册函数中的一个缺陷。但是,HTTP调用看起来是正确的。我唯一能想到的是this.base_url值是否为无效url。你能分享一下吗?你的服务器可能与ng serve提供的Angular应用程序位于不同的端口。如果是这样的话,我肯定这是一个CORS问题,因为对于浏览器localhost:5001和localhost:{OTHER_PORT}是不同的源,无论它们在同一台机器上。