Angular 2 Observable替代语法

时间:2017-02-03 10:40:51

标签: angular typescript observable

从'./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;
});

1 个答案:

答案 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 (打开你的控制台)