异步/等待 AngularFire2 toPromise() 方法不起作用?
Async / Await with AngularFire2 toPromise() method wont work?
我刚刚在使用 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}));
}
那么怎么可能创建承诺并解析 Observable 数据有效而 .toPromise() 方法无效呢?
这是正常行为吗?难道我做错了什么 ?让我知道:-)
之所以行不通是因为你的承诺从未兑现。
为了解决您的承诺,您的 observable 需要 complete
.
因此,如果您简单地在 toPromise() 前面添加 take(1)
,您将获得所需的效果:
return this.db.object('clients/' + clientId)
.valueChanges()
.take(1)
.toPromise();
我刚刚在使用 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}));
}
那么怎么可能创建承诺并解析 Observable 数据有效而 .toPromise() 方法无效呢?
这是正常行为吗?难道我做错了什么 ?让我知道:-)
之所以行不通是因为你的承诺从未兑现。
为了解决您的承诺,您的 observable 需要 complete
.
因此,如果您简单地在 toPromise() 前面添加 take(1)
,您将获得所需的效果:
return this.db.object('clients/' + clientId)
.valueChanges()
.take(1)
.toPromise();