在 angular 4 中的 http api 调用中获得响应后如何 return 数据?

how to return the data after getting response in http api call in angular 4?

This is my function which i define in my service and i am calling this service method in my component but it return before the response has come from http api call, so i get undefined return data.

    home(){
       this._http
      .post("http://localhost:3000/home", {
      email: JSON.parse(this.cookieService.get("token")).email
    })
    .subscribe(data => {
      this.result = JSON.parse(data["_body"]);
     console.log(this.result); 
     send=>{return this.result}
    })
  }

您的服务功能如下:

home() {
  return this._http.post("http://localhost:3000/home", {
    email: JSON.parse(this.cookieService.get("token")).email
  }).map((res:Response) => res.json());
}

然后在您的组件中您需要订阅该服务以便进行 API 调用并且您可以将结果存储在您的组件变量中。

//Component code

componentFunction() {
  this.chatService.home().subscribe(data => {
    this.result = JSON.parse(data["_body"]);
    console.log(this.result);
  });
}

Return 从您的服务中观察到的结果如下所示,

home() : Observable<any> { 
    return this._http
      .post("http://localhost:3000/home", {
          email: JSON.parse(this.cookieService.get("token")).email
      })
     .map(data => {
        let result = JSON.parse(data["_body"]);
        return result;
     });
}

并订阅返回的 Observable 组件代码,

this.chatService.home().subscribe((result) => { this.result = result; });

"angular way" 是服务 return 一个 Observable。它是在 OnInit

中订阅服务的组件
//Your service
home(){
       return this._http  //<--return the http.post
      .post("http://localhost:3000/home", {
      email: JSON.parse(this.cookieService.get("token")).email
    }).map((res:Response) => res.json())

//Your component
    constructor(private myService:Service)
    //Normally in onOnInit
    ngOnInit()
    {
     this.myService.subscribe(data => {
        this.result=data;
      })
    }

根据你的评论你做了

this.result=this.chatService.home();

在您的服务中,您

.subscribe(data => {
  this.result = JSON.parse(data["_body"]);
 console.log(this.result); 
 send=>{return this.result}
})

你们都做错了.

当您进行异步 HTTP 调用时,您需要在订阅中分配值。由于您在组件中调用它,因此您应该改为

this.result=this.chatService.home()
  .subscribe(data => this.result = data);

在你的服务中,你得到这个

home(){
 this._http
   .post("http://localhost:3000/home", {
     email: JSON.parse(this.cookieService.get("token")).email
   })
   .map(res => res.json())

发生的情况是您将订阅逻辑移动到您的组件。您还需要使用 map 运算符,因为据我所见,您在这里处理的是 JSON:this.result = JSON.parse(data["_body"]);。嗯,Angular Response 对象有一个 json() 方法就是为了这个目的!