是否有更实用的方法将这些可观察对象与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);
})
});
答案 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 => ???)
逻辑中自行处理。