从异步函数返回可观察到的

弗里索·霍克斯特拉

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));
BM

在您的实现中create返回一个承诺,因为正如您指出的那样,它需要工作async如果这是事实,那么您必须修改上下文调用create:也只需创建调用函数asyncawait在调用之前添加createawait 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,依此类推-这就是Promises的定义方式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章