从'./Users/edwardhung/Desktop/timesheet-web-app/timesheet-web-app-new/src/app/services/user.service'导入{UserService}; 我使用角2与firebase。目前我有以下函数,它将UID转到firebase中的一个分支,以查找存储用户信息存储位置的路径的数据。 当数据恢复时,我创建了第二个请求,根据路径获取该数据。
来自UserService.ts的
getUserInformation(uid: string) {
return this.angularFire.database.object('/pathForUid/' + uid).map(results => {
return this.angularFire.database.object('/' + results.path)
});
}
这就是我调用函数的方式
this.userService.getUserInformation(data.uid)
.subscribe(result => {
result.subscribe(res => {
let user: User = res;
this.userService.setCurrentUser(user);
})
});
这里的一切都运行正常,除了我发现这个语法abit奇怪的两个返回和两个订阅。 当我在Swift中编码时,它只是在回调内部回调,而不需要返回两次或订阅两次。
这是唯一正确的方法吗?还是有其他语法,我不必订阅两次? 对我来说,在我调用函数的地方有两个订阅并没有多大意义。我想也许有办法做类似下面的事情
this.userService.getUserInfoInOneGoWithId(data.uid)
.subscribe(result => {
let user: User = result;
});
答案 0 :(得分:0)
正如@AngularFrance所说,你想链接你的观察者。
但您可能不想使用mergeMap,而是使用switchMap:
// mock the service which returns http response (observable)
// return a user for some uid
const someService =
(uid) =>
Observable
.of({ user: 'Unicorn' })
// simulate an HTTP delay
.delay(1500)
const { Observable } = Rx
const obs = Observable.of({ uid: 'some-uid' })
obs
.do(_ => console.debug('starting an http request'))
.switchMap(uid =>
someService(uid)
.do(_ => console.log('response received !'))
.map(user => console.debug(user))
)
.subscribe()
结果是:
// output instantly :
starting an http request
// outputs 1.5s later :
response received !
{user: "Unicorn"}
这是一个有效的Plunkr:
https://plnkr.co/edit/s7YUROGAJ9RzHxj5vi82?p=preview
(打开你的控制台)