TLDR; 我有一个 Promise collection().add()
,它解析为带有监听器函数 的对象
发出数据。 DocumentReference
onSnapshot()
我需要返回一个 Observable,它在订阅时调用 Promise,订阅解析对象上的监听器函数,并将监听器中的值广播到 subscriber.next()
上下文:
我试图声明一个函数,该函数创建一个 Firestore 文档,然后使用 onSnapshot()
函数在其由 collection().add() 返回的 DocumentReference 上返回一个带有文档数据的 Observable
.
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
返回一个 promise ,因为正如您指出的那样它需要工作 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
再次返回 Promise
其中又有 .then
等等-这就是Promise
s 已定义。
关于javascript - 从异步函数返回 observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57473522/