【问题标题】:Return final observable from nested block从嵌套块返回最终的 observable
【发布时间】:2019-05-28 23:00:04
【问题描述】:

大家好,我有以下代码:

return this.facebook.getFacebookUserInfos(req.token).pipe(
      switchMap(user => {
            return this._repo.findBy({email: user.email}).pipe(
              switchMap(foundUser => {
                // assume foundUser is always null 
                if (!foundUser) {
                  const fromFacebook = this.createUserModel(user, event.queryStringParameters);
                 return this._repo.save(fromFacebook);
                }
                return of(foundUser);
              }));
          }),
          switchMap(user => {
            return this.getAuthToken(user)
          }),
          map(response => Response.ok(response.body, response.headers)),
          catchError((err) => of(Response.errorResponse(err)))
        );

我被卡住了,因为它调用 this._repo.save(fromFacebook) 并且不等待可观察对象完成并使用另一个可观察对象进入下一个切换映射。如何强制块在传递到下一个之前等待 this._repo.save(fromFacebook) 的结果? save 方法也返回一个 observable。在此先感谢您的帮助。 干杯

【问题讨论】:

  • 顺便说一句,没有必要嵌套你最里面的switchMap。如果将运算符构造为:switchMap(user => this._repo.findBy(...)),则可以在同一级别紧跟内部的switchMap
  • @miqh 我本来就有,但是如果findBy的返回为null,那么我将无法创建用户,因为用户变量将超出范围

标签: node.js typescript rxjs observable


【解决方案1】:

试试下面的代码 sn-p。

return this.facebook.getFacebookUserInfos(req.token).pipe(
      switchMap(user => {
            return this._repo.findBy({email: user.email}).pipe(
              switchMap(foundUser => {
                // assume foundUser is always null 
                if (!foundUser) {
                  const fromFacebook = this.createUserModel(user, event.queryStringParameters);
                 return this._repo.save(fromFacebook);
                } else {                
                 return of(foundUser);
                }
              }));
          }),
          concatMap(user => {
            return this.getAuthToken(user)
          }),
          map(response => Response.ok(response.body, response.headers)),
          catchError((err) => of(Response.errorResponse(err)))
        );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多