【问题标题】:How to return a true or false after HTTP request in an angularJS function如何在angularJS函数中的HTTP请求后返回真或假
【发布时间】:2018-01-05 16:46:18
【问题描述】:

环境 AngularJS 4

我尝试在函数中运行 HTTP 请求,但无法将结果发回。 下面已经用一些 cmets 发布了我的代码。 我只需要truefalse 值,但我什么也没收到。

我在这个问题上苦苦挣扎了一段时间,但没有找到解释和解决方案。有人可以给我提示吗?

public runLoginProcess(username:String, password:String):boolean{

    let body= { "username":username,"password":password };
    let head = new Headers();
    head.append("Content-Type", "application/json");
    head.append("Accept", "application/json");

// RUN THE HTTP CALL AN IF IT WORKS, SEND TRUE AND ERROR IN CASE OF AN ERROR BACK
    this.http.post("<PATH TO MY SERVICE>", body)
      .subscribe(response => {
          let token = response.json() && response.json().token;
          if (token) {
            localStorage.setItem('currentUser', JSON.stringify({"username": username, "token": token}))
            return true;
          }
        },
        error2 => {
          return false;
        }
      );
  }

【问题讨论】:

  • Node.js promises, async, or just callbacks 的可能重复项。您必须使用某种异步构造:回调、pomises 或现在等待。
  • 您是否希望 runLoginProcess 返回真/假结果?我怀疑您期望固有异步函数的同步行为。尝试使用您的调试器,或者尝试在您调用 http.post 之后立即放置一个 console.log,并在您的 return true/return false 语句之前放置一个 console.log 调用。如果你能控制它,也许会延迟你的 HTTP 服务。然后观察执行顺序。
  • 这是 Angular,而不是 AngularJS。没有 AngularJS 4 这样的东西。

标签: angular http


【解决方案1】:

你对 observables 的处理方法完全不对。您的 runLoginProcess 函数没有返回任何内容,并且 subscribe 函数根本不应该返回。你应该使用它的方式更像是

public runLoginProcess(username:String, password:String):Observable<boolean>{

    let body= { "username":username,"password":password };
    let head = new Headers();
    head.append("Content-Type", "application/json");
    head.append("Accept", "application/json");

// RUN THE HTTP CALL AN IF IT WORKS, SEND TRUE AND ERROR IN CASE OF AN ERROR BACK
    return this.http.post("<PATH TO MY SERVICE>", body)
      .map(response => {
          let token = response.json() && response.json().token;
          if (token) {
            localStorage.setItem('currentUser', JSON.stringify({"username": username, "token": token}))
            return true;
          } else {
             return false;
          }
        }
      )
      .catch(err => Observable.of(false)); //this line isn't needed, but just if you don't want to error handle at the caller's subscription, you can intercept them here and map to a false value.
  }
  
  
  
  var loggedIn;
  
   this.runLoginProcess().subscribe(
      (val) => this.loggedIn = val
    );
  
  

这样,您从帖子中获取响应,将其映射为布尔值,将该可观察序列返回给调用者,然后调用者订阅可观察对象并在订阅中接收布尔值。

请记住,可观察对象只是对如何处理值流的定义。

【讨论】:

  • 感谢您的快速回复,但我面临的问题是,http.post() 没有地图,只有一个 subscribe()
  • 你需要从'rxjs/Observable'导入{Observable};或导入'rxjs/add/operator/map'; angular4 http 客户端返回始终具有 map 方法的 observables。如果您使用的是自定义 http 客户端,那么这是一个单独的问题。
  • Observable 被添加到这个类中
  • 那么还有其他问题,要么你在某处覆盖了 http 服务,要么你的编译器有问题。 http 客户端总是返回总是有一个 map 方法的 observables。您是否将函数返回类型更改为 Observable?你返回的 http 方法和我写的完全一样吗?
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多