在subscribe中初始化变量总是未定义Angular rxjs

时间:2016-11-17 13:56:41

标签: angular rxjs

我是angular2 typescript和rxjs以及observables的新手。

我正在尝试使用此代码从api获取信息

let Alertsanswer = this.LogService.getAlertsForClient(this.userId);
    var a = Alertsanswer.subscribe((response) => {
       this.alerts=JSON.parse(response)
console.log(this.alerts) //give the right response.
    },
      error => {
        var err = error;

        alert(err);
      }
    )

你可以在订阅中看到我初始化一个私有变量:" this.alerts"

在订阅之外,此变量具有未定义的值 console.log(this.alerts)//给出undefined。

在组件doom中使用this.alert也是未定义的 这给出了一个错误:

<div>{{alerts}}</div>

第一个问题:为什么&#34;&#34;在订阅中的this.alerts为控制台提供正确的值,但外部(包括厄运)总是未定义。

第二个问题:我理解来自服务器的值是异步的,如果我有更多的代码可以在答案中继续我写它(回调),它会在订阅中吗? subscribe是什么意思? 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

对于您的第一个问题,this.alertssubscribe finish之后获取正确的值(从api获取数据),在完成之前使用this.alerts将不会给出正确的值。您应该使用<div *ngIf="alerts">{{alerts}}</div>来确保数据可以使用。例如,在订阅完成之前,使用<div>{{alerts.property}}</div>将引发错误。 console.log也是同样的原因。

对于你的第二个,请使用:

this.LogService.getAlertsForClient(this.userId)
.subscribe(response => this.alerts = JSON.parse(response),
()=>console.log('error'),
()=>yourFuncRelayOnTheResponse(this.alerts)); 

答案 1 :(得分:0)

嘿,你通过将服务分配给变量来做一些不稳定的事情。编辑了一些代码,向您展示我将如何定义:

export class LoginComponent
{
    private alerts; //This needs to be defined here on the class first

    constructor(public loginService: LoginService)
    {
    }

    ngOnInit()
    {
        this.LogService
            .getAlertsForClient(this.userId)
            .subscribe(response =>
                {
                    this.alerts = JSON.parse(response); // Assign response to class member alerts.
                },
                error=>
                {
                    console.log(error);
                })
    }
}