Angular4从Observable中提取值

时间:2017-12-18 12:33:45

标签: angular

我试图从http.get()获取值并将其分配给局部变量。

这是我的代码。的 UserName.ts

import { Http } from '@angular/http';

this.http.get('http://localhost:8000/user/').subscribe(res => { 
  this.username$ = res;
  console.log(this.username$)}) //working


console.log(this.username$)

我正在未定义作为输出

http电话 - http://localhost:8000/user/ 只会返回一个用户名。我必须将它存储在变量中。并使用它来调用另一个http调用

return this.http.get(`http://localhost:8001/getdettails/${this.username$}/${experimentPath}`)

请帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:4)

你必须在好的时候打电话(例如:在你的观察者的回调中)。

目前,您的第一个订阅在到达最后console.log行时没有时间完成。因此,该变量尚未设定。只有在稍后,当订阅返回时,才会执行回调,因此回调中的console.log会显示一些值。

要解决您的问题,您可以在第一个订阅的回调中进行第二次http调用,但嵌套订阅不是一个好习惯。

(感谢@ Jota.Toledo):您可以查看这篇文章,以便更好地使用RxJ mergeMap将第一个observable的结果链接到第二个http调用:

How to chain Http calls in Angular2

在您的情况下,这将导致类似这样的事情:

import 'rxjs/add/operator/mergeMap';

this.http.get('http://localhost:8000/user/').map((res: Response) => {
           this.username$ = res;
           return res;
        })
        .mergeMap(username => this.http.get(`http://localhost:8001/getdettails/${this.username$}/${experimentPath}`)).map((res: Response) => res.json())
        .subscribe(res => {
             console.log('Here is your result from second call:');
             console.log(res);
        });

(也许你必须略微适应,具体取决于输出)