繁体   English   中英

从异步函数返回 observable

[英]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之前添加awaitawait 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM