解决诺言角5和火焰基地

时间:2018-03-10 22:05:03

标签: angular firebase firebase-realtime-database promise angular5

我有一个问题,当我尝试从方法返回一个值返回为undefined时,这是方法:

getBrandName(keyVehicle): any{
    var nameBrand;
    let response=this.db.getBrand(keyVehicle);
    response.then((value)=>{
      nameBrand= value.name;
    })  
    return nameBrand;
  }

inside方法我得到了值,但是当返回值时,这个未定义,请帮助我。

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。

1)退还承诺。 您可以返回promise并在调用此函数的代码中等待completition。

getBrandName(keyVehicle): any {
    return this.db.getBrand(keyVehicle).then((value) => value.name);
}

// from other place
this.getBrandName("foo").then(nameBrand => console.log(nameBrand));

2)通过回调(这可能不是一个好主意,但有机会,所以你可以这样做。)

getBrandName(keyVehicle, callback): any {
    this.db.getBrand(keyVehicle)
        .then((value) => value.name)
        .then(brandName => callback(brandName));
}

// from other place
this.getBrandName("foo", brandName => console.log(brandName));

3)使用async/await(可能是推荐的方式)

async getBrandName(keyVehicle): any {
    const response = await this.db.getBrand(keyVehicle);
    return response.name;
}

无论哪种方式,请记住这是一个纯粹的Javascript / Promise问题,无论您使用的是角度,火焰基础还是任何其他工具。

答案 1 :(得分:0)

这是正确的。如果您立即返回nameBrand,由于var nameBrand,初始值为空。

只有在调用response.then时,才会填充局部变量nameBrand

您可以尝试以下方法,

export class ABC {
    nameBrand = [];
    getBrandName() {
        this.db.getBrand().then((value) => {
            this.nameBrand = value;
        }
    }
}

但在this.nameBrand来电完成后,您仍会收到http,而不是仅在getBrandName()之后。

有道理,这是async电话。