[英]Return observable from async function
TLDR; 我有一个 Promise collection().add()
,它解析为一个对象DocumentReference
带有一个发出数据的监听器函数onSnapshot()
。
我需要返回一个 Observable,它在订阅时调用 Promise,订阅解析对象上的侦听器函数,并将值从侦听器广播到subscriber.next()
上下文:我试图声明一个创建 Firestore 文档的函数,然后返回一个带有文档数据的 Observable,在collection().add()
返回的 DocumentReference 上使用onSnapshot()
函数。
基于: 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,我需要函数来返回一个 observable。
预期:我需要来自ref.onSnapshot()
回调的一部分数据,在本例中为doc.data()
,以在我的模板中使用它,例如
// ...
this.service.create(project).subscribe(project => console.log(project));
在您的实现中, create
返回一个promise,因为正如您所指出的,它需要async
。 如果这是事实,那么您必须修改调用create
:的上下文,只需使调用函数也async
,并在调用create
之前添加await
: await create(...)
。
或者,如果您无论如何要返回一个可观察的对象,则必须停止await
db.collection().add()
并在create
之前删除async
。 然后,您可以直接返回可观察对象,并在db.collection().add()
doc.data()
函数内部.then
可以使用doc.data()
更新可观察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
再次返回Promise
,该Promise
再次具有.then
,依此类推-这就是Promise
的定义方式。
尝试使用from
运算符直接从Promise创建可观察的对象。 这是它的文档: https : //www.learnrxjs.io/operators/creation/from.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.