代码之家  ›  专栏  ›  技术社区  ›  Anjil Dhamala

RXJS:返回外部可观测的操纵值

  •  2
  • Anjil Dhamala  · 技术社区  · 6 年前

    return this.http.get(requestUrl)
                .map((response: User) => {
                    sessionManager.currentUser = response;
                    return this.isFirstTimeUser(response.id);
                })
                .do((response: any) => {
                    console.log(response);
                    sessionManager.currentUser.firstTimeLogin = response === 'true';
                    return Observable.create(sessionManager.currentUser);
                })
                .toPromise();
    

    private isFirstTimeUser(userId: number): Observable<any> {
            const requestUrl = 'someUrl';
            return this.http.get(requestUrl, {responseType: 'text'});
        }
    

    我只想从第一个http调用中获取user对象,然后使用用户的 id 在第二个调用中,然后在从第二个可观察对象返回响应之后,更新第一个响应的属性并返回更新后的第一个响应。我如何做到这一点?我应该看什么rxjs函数?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Reactgular    6 年前

    你的例子很接近。

    switchMap 哪一个 取消订阅 到传入的可观察到的,和 下一个可观察到的。

    return this.http.get(requestUrl)
            .switchMap((response: User) => {
                sessionManager.currentUser = response;
                return this.isFirstTimeUser(response.id);
            })
            .map((response: any) => {
                console.log(response);
                sessionManager.currentUser.firstTimeLogin = response === 'true';
                return sessionManager.currentUser;
            })
            .toPromise();
    

    isFirstTimeuser() 以下是 .map() 将应用于该函数返回的observated。

    它叫 因为 this.http.get() 使用下一个可观测的。这不成问题 ,但请记住 开关图 第一 发射值。

        2
  •  2
  •   codeepic zetriks    6 年前

    getUser(): Observable<any>{
        return this.http.get(reqUrl)
            .do((res: User) => {
                sessionManager.currentUser = res;
            })
            .switchMap((res: User) => {
                return this.isFirstTimeUser(res.id);
            })
            .do((res: any) => {
                console.log(response);
            }
            .map((res: any) => {
                sessionManager.currentUser.firstTimeLogin = res === 'true';
                return sessionManager.currentUser;
            });
    }
    

    那你只需要订阅 getUser() 你应该没事的。根据rxjs纯函数的函数范式,它仍然不是最好的代码。我想用 concatMap 用投影函数可以使我们更接近理想,但它会起作用。

    .do() 布洛克,我们更新 sessionManager 值-函数外的一个变量(函数世界中的一个大禁忌),然后我们在中再次访问它 .map() 功能。 浓缩图 用投影函数作为第二个参数可以让我们绕过这个问题。

        3
  •  0
  •   Fartab    6 年前

    使用合并地图

    return this.http.get(requestUrl)
                .mergeMap((response: User) => {
                    const currentUser = response;
                    currentUser.firstTimeLogin = this.isFirstTimeUser(response.id) === 'true' 
                    return Observable.of(currentUser);
                })