TLDR;我有一个Promise collection().add()
,它DocumentReference
使用onSnapshot()
发出数据的侦听器函数解析为一个对象。
我需要返回一个Observable,该对象在订阅时会调用Promise,在已解析的对象上订阅侦听器功能,并将值从侦听器广播到 subscriber.next()
上下文:我正在尝试声明一个函数,该函数创建一个Firestore文档,然后使用由onSnapshot()
返回的DocumentReference上的函数,返回一个包含文档数据的Observable collection().add()
。
基于:https : //github.com/EddyVerbruggen/nativescript-plugin-firebase/blob/f6972433dea48bf1d342a6e4ef7f955dff341837/demo-ng/app/item/items.component.ts#L175-L185
async create(project) {
const ref = await this.db.collection('projects').add(project);
return new Observable(subscriber => {
ref.onSnapshot(doc => {
// ...
subscriber.next(doc.data());
});
});
}
当前行为:async/await
总是返回一个Promise,我需要该函数返回一个可观察值。
预期:ref.onSnapshot()
在这种情况下doc.data()
,我需要从回调中获取数据的一部分,以便在我的模板中使用它,例如
// ...
this.service.create(project).subscribe(project => console.log(project));
在您的实现中create
返回一个承诺,因为正如您指出的那样,它需要工作async
。如果这是事实,那么您必须修改上下文调用create
:也只需创建调用函数async
并await
在调用之前添加create
:await create(...)
。
作为替代方案,如果你想返回一个可观察到的无论是什么,你必须停止await
荷兰国际集团的db.collection().add()
并删除async
之前create
。然后,您可以直接返回可观察对象,并且可以在.then
函数内部使用以下命令db.collection().add()
更新可观察对象doc.data()
:
create(project) {
return new Observable(subscriber => {
this.db.collection('projects').add(project)
.then(ref => {
ref.onSnapshot(doc => {
// ...
subscriber.next(doc.data());
});
});
});
}
请注意,这await
只是处理的一种方法Promise
。更为经典的方法是在上附加一个回调.then
。请注意,.then
再次返回a Promise
,其中又包含a .then
,依此类推-这就是Promise
s的定义方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句