离子3& Firebase - 嵌套可观察对象的正确方法

时间:2017-09-05 08:43:35

标签: typescript firebase ionic-framework rxjs

是否有更实用的方法将这些可观察对象与RX / JS嵌套。这是一个片段,我首先存储一个图像,然后返回下载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);
        })
      });

1 个答案:

答案 0 :(得分:1)

您可以使用高阶Observables和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;
    });
});

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