【问题标题】:How to return observable from subscribe?如何从订阅中返回 observable?
【发布时间】:2018-02-11 12:32:55
【问题描述】:

例如,我有这样的代码:

// angular service post method
postUser(): Observable<User> {
   this.tokenService.getToken().subscribe(token => {
       // need to return this observable
       return this.http.post<User>(url, {token});
   })
}

【问题讨论】:

  • 你想通过这段代码解决什么问题?

标签: javascript angular typescript observable


【解决方案1】:

如果这样做,返回类型是Observable&lt;Observable&lt;User&gt;&gt;,不好:

  getUser(): Observable<Observable<User>> {
    return this.accessToken$.pipe(
      map(_ => {
        return this.http.get<User>(`${environment.apiURL}/user`)
      }),
    );
  }

使用mergeMap:

 getUser(): Observable<User> {
    return this.accessToken$.pipe(
      mergeMap(_ => {
        return this.http.get<User>(`${environment.apiURL}/user`)
      }),
    );
  }

有关详细信息,请参阅“Flattening nested Observables”。

【讨论】:

    【解决方案2】:

    你不能,但你可以很容易地避免使用subscribe,而是使用map,或do

    postUser(): Observable<User> {
       return this.tokenService.getToken().map(token => {
           // need to return this observable
           return this.http.post<User>(url, {token});
       })
    }
    

    您可能想查看mergeMap 和其他可用的运算符以及您的用例。 另见https://www.learnrxjs.io/operators/transformation/mergemap.html

    【讨论】:

    • 你能用 HttpClient 做到这一点吗?
    • @Jota.Toledo 你为什么这么认为?
    • 你的sn-p的返回类型目前是Obsevable&lt;Observable&lt;User&gt;&gt;
    • Observable&lt;Observable&lt;User&gt;&gt; 的修复已在此处得到解答:stackoverflow.com/a/56982273/1517394
    【解决方案3】:

    这里是代码示例

      save(person: Person) : Observable<Response>{
        return this
          .http
          .put(`${this.baseUrl}/people/${person.id}`,
                JSON.stringify(person),
                {headers: this.getHeaders()});
      }
    

    更多详情请见here

    并使用switchMap 管理嵌套的 Observables。

    您的帖子应该更新数据库。为什么没有用户在您的方法的参数中?

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2017-03-26
      • 2019-03-09
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多