【问题标题】:Ionic 3 & Firebase - Proper way to nest observablesIonic 3 & Firebase - 嵌套 observables 的正确方法
【发布时间】:2018-02-13 11:52:54
【问题描述】:

有没有更实用的方法来用 RX/JS 嵌套这些 observables。这是一个 sn-p,我首先存储图像,然后返回下载 URL 并将其放入实时数据库中。

return new Observable(observer => {
        firebase.storage().ref().child('users/' + this.userService.getUserID() + '/messages/').put(image).then((data) => {

          updates['photoURL'] = data.downloadURL;

          firebase.database().ref().update(updates).then(() => {
            observer.next();
            observer.complete();
          }).catch((error) => {
            observer.error(error);
          })
        }, (error) => {
          observer.error(error);
        })
      });

【问题讨论】:

    标签: typescript firebase ionic-framework rxjs


    【解决方案1】:

    您可以使用高阶 Observable 和 their respective operators 来内联相互依赖的操作。例如:

    function uploadImageAndUpdateState(userId, image, updates) {
      return Observable.defer(() => firebase.storage().ref().child(`users/${userId}/messages/`).put(image))
        .mergeMap(imagePutData => {
          updates['photoURL'] = imagePutData.downloadURL;
          return firebase.database().ref().update(updates;
        });
    });
    

    通过在图像放置(承诺)上使用Defer(),此 Observable 将在订阅uploadImageAndUpdateState 以上传图像后启动,在从该操作接收数据后修改updates 并在 firebase 中更新它。由于您的示例不包含错误处理(仅传播),因此此函数中未完成此操作,您仍需要在 subscribe(.., onError => ???) 逻辑中自行处理。

    【讨论】:

    • 在 sn-p 中的代码是否存在潜在的缺点或不良行为?
    • 根据问题 sn-p 的代码的缺点:由于使用了低抽象方法,不支持取消,有点混乱和多余(new Observable // Observable.create() vs Observable.from() / / Observable.defer() // ...
    • 如果只是对 firebase 的单一调用,是否可以接受本教程中的低级方法? masteringionic.com/blog/…
    • 尽管Observable.create just wraps new Observable() 前者是首选。但这只是语法。它会起作用的。正如我之前的评论所述;如果你应该使用更合适的函数来组成你搜索的行为,你并没有从 Observables 中获得所有好处。
    • 在嵌套三个 firebase 调用或 N api 调用以获取更一般的情况时,是否有任何模式可以遵循?
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多