变量不能从subscribe方法分配

时间:2017-03-06 22:17:18

标签: javascript angular

在方法本身内显示值,但在其外部显示未定义的消息

Ubigeo.service.ts

 lisProvinciaByDepartamento( ubigeoId: string): Observable<Ubigeo[]> {
    let ubigeo$ = this.http
    .get(`${this.baseUrl}/provincia/${ubigeoId}`, {headers: this.getHeaders()})
    .map(mapUbigeos)
    .catch(handleError);
    return ubigeo$;
}

Detail.component.ts

cargaPronvicia(ubigeoId: string) {
    this._ubigeoService
        .lisProvinciaByDepartamento(ubigeoId)
        .subscribe((p) => {
            this.provinciaSeleccionada = p
                .find(item =>
                    item.ubigeoId.substr(2, 2) === ubigeoId.substr(2, 2));
            this.provincias = p;
            console.log(this.provinciaSeleccionada); //2
        });

    console.log(this.provinciaSeleccionada); //1
}

undefined in console

1 个答案:

答案 0 :(得分:3)

因为当您将其用作观察对象时,数据检索相对 async 。 所以永远不要直接使用变量,

良好做法

  1. 如果订阅为空,请跳过订阅。

    cargaPronvicia(ubigeoId: string) {
       this._ubigeoService
        .lisProvinciaByDepartamento(ubigeoId)
         ////////////////////////////////////////////////////////////////
        .skipWhile((p) => p === undefined)
         ////////////////////////////////////////////////////////////////
        .subscribe((p) => {
            this.provinciaSeleccionada = p
                .find(item =>
                    item.ubigeoId.substr(2, 2) === ubigeoId.substr(2, 2));
            this.provincias = p;
            console.log(this.provinciaSeleccionada); //2
        });
    
    console.log(this.provinciaSeleccionada); //1
    }
    
  2. 无论您使用订阅的变量,请检查它是否包含数据,您的案例中的示例将是

    if(this.provinciaSeleccionada){
        console.log(this.provinciaSeleccionada);
    }
    
  3. 更新1:

    • 最谨慎地使用promises,当你在构造函数中使用promises时,原因是,在你的promise被解决之前你的组件将不会加载
      • 按此应用程序的速度将如预期的那样。
      • 没有利用Angular2的反应性质。