我有如下代码可在firebase实时数据库中创建新记录
assignCoupon(email:string, discType: string, discVal: number, code:string){
let coupon = {
"discType" : discType,
"discVal": discVal,
"code": code
}
this.db.list('/users/' + uid + '/coupons').push(coupon).then(
(resp) => console.log("user created with:" + resp)
)
}
这很好。但是我需要将响应作为承诺返回给调用代码,以便可以向用户显示消息。与snapshotChanges()不同,它不返回预订。那么在这种情况下我该怎么办呢?为了清楚起见,尝试使用与下面的代码相同的样式
getOrderHistory(uid:string){
console.log('start of getOrderHistory with uid:' + uid)
return new Promise((resolve, reject) =>
{
this.db.object("/users/" + uid + "/orders").snapshotChanges().map(
(snapshot) => {return snapshot.payload.val()}
).subscribe(
res => {
//console.log('response:' + res)
resolve(res)
},
err => {
console.log(err)
reject(err)
}
)
})
}
答案 0 :(得分:1)
此答案不在您的问题范围内,您的问题已在评论中得到回答。
查看您的getOrderHistory
函数,您可以使用rxjs/toPromise
稍微整理一下诺言。
如果您使用valueChanges()
而不是snapshotChanges()
,则不需要map
响应,因为angularfire2
返回了有效载荷值。
使用.pipe(first())
方法将获取第一个订阅事件(如果数据不存在,则为null)并将其包装为承诺。
此优化功能应该与上面的示例相同,并且不会留下您需要取消订阅的订阅,因为first
运算符将在收到第一个值后关闭订阅。>
// Import the operator
import { first } from 'rxjs/operators';
getOrderHistory(uid: string) {
return this.db.object(`/users/${uid}/orders`)
.valueChanges()
.pipe(first())
.toPromise();
}