javascript - 从异步函数返回 observable

标签 javascript firebase promise async-await observable

TLDR; 我有一个 Promise collection().add() ,它解析为带有监听器函数 的对象 DocumentReference onSnapshot() 发出数据。

我需要返回一个 Observable,它在订阅时调用 Promise,订阅解析对象上的监听器函数,并将监听器中的值广播到 subscriber.next()

上下文: 我试图声明一个函数,该函数创建一个 Firestore 文档,然后使用 onSnapshot() 函数在其由 collection().add() 返回的 DocumentReference 上返回一个带有文档数据的 Observable .

基于: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返回一个 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/

相关文章:

node.js - 找不到模块 'firebase-tools' 的声明文件

java - Firebase 电子邮件/PW 身份验证无法注册

javascript - promise : How to return a value from a "then" block of "Promise.all" back to the invoking code?

javascript - 有没有一种方法可以创建在加载 Google Maps Javascript API 时解析的 promise ?

javascript - 在Promise.all()中编写多个map函数

javascript - Kendo 网格 - 获取当前编辑行

javascript - 一旦不再需要 View ,取消委托(delegate)事件的最佳方式

javascript - 如何为玩家分配一个 2 位数的唯一 ID

javascript - jQuery 手机 : Position of external panel/always visible?

android - 捕获 401 并刷新 Firebase Id token