Asular / Await与AngularFire2 toPromise()方法不起作用?

时间:2017-12-29 14:36:17

标签: angular async-await angularfire2 angular2-observables

我使用AngularFire2 Observables时遇到了一个奇怪的问题,看看这段代码并告诉我你是否知道发生了什么:

async save(){
 const client = await this.getClient(this.id);
 console.log(client); // ZoneAwarePromise blah blah
}

getClient(clientId) {
 return this.db.object('clients/' + clientId)
            .valueChanges()
            .toPromise()
            .then((client: any) => {key: clientId, name: client.name});
}

所以这段代码不会起作用,但如果我像下一段代码一样,它会起作用:

async save(){
 const client = await this.getClient(this.id);
 console.log(client); // {key: 'blah', name: 'fooblah'}
}

getClient(clientId) {
 return new Promise((resolve, reject) => {
    this.db.object('clients/' + clientId)
            .valueChanges()
            .subscribe((client: any) => resolve({key: clientId, name: client.name}));
}

那么,当.toPromise()方法不起作用时,如何创建一个promise并解析Observable数据呢?

这是正常行为吗?难道我做错了什么 ?让我知道: - )

1 个答案:

答案 0 :(得分:3)

它不起作用的原因是因为您的承诺永远不会被解决

为了使您的承诺得到解决,您的可观察需要 complete

因此,如果您只使用 take(1) 添加toPromise(),您将获得所需的效果:

return this.db.object('clients/' + clientId)
              .valueChanges()
              .take(1)
              .toPromise();