【问题标题】:Angular 2 Observable alternative syntaxAngular 2 Observable 替代语法
【发布时间】:2017-02-03 21:47:16
【问题描述】:

从'./Users/edwardhung/Desktop/timesheet-web-app/timesheet-web-app-new/src/app/services/user.service'导入{UserService}; 我正在使用带有firebase的angular 2。目前我有以下函数,它需要一个 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);
    })
});

这里一切正常,除了我发现这个语法有点奇怪,两个返回和两个订阅。 当我在 Swift 中编码时,它只是在回调中进行回调,而无需返回两次或订阅两次。

这是执行此操作的唯一且正确的方法,还是有其他语法,我不必订阅两次? 对我来说,在我调用函数的地方有两个订阅真的没有意义。我在想也许有一种方法可以执行以下操作

this.userService.getUserInfoInOneGoWithId(data.uid)
    .subscribe(result => {
    let user: User = result;
});

【问题讨论】:

  • 看起来你想要链接两个 observables,这通常使用 .mergeMap() 操作符来完成。语法类似于obs1.mergeMap(obs2),其中obs2 可以使用obs1 返回的数据,并使用常用运算符继续转换结果。在此处查看示例:stackoverflow.com/a/42021832/1153681

标签: angular typescript observable


【解决方案1】:

正如@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 (打开你的控制台)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多