代码之家  ›  专栏  ›  技术社区  ›  Parziphal

rxjsv6.3管道-如何使用?

  •  2
  • Parziphal  · 技术社区  · 6 年前

    对于v6.2,我只能指定管道的最终返回值(在本例中, .pipe<User>

    getStatus(): Observable<User> {
      return this.http.get('/user/status')
        .pipe<User>(
          tap(foo, bar),
          finalize(() => this.requestEnded()),
          map((resp) => new User(resp.user)));
    }
    

    但在新版本中,他们在可观察类中消除了这种可能性(他们从 v6.2.2 ,在 v6.3

    至少应为0个参数,但得到1个或多个。

    现在,我被迫为管道中的每个函数指定类型,如下所示:

    getStatus(): Observable<User> {
      return this.http.get('/user/status')
        // If I have 3 piped functions I have to specify all 3 types
        .pipe<{}, {}, User>(
          tap(foo, bar),
          finalize(() => this.requestEnded()),
          // I even have to specify type for this parameter (resp)
          map((resp: {user}) => new User(resp.user))); 
    }
    

    这真的是故意的吗?请注意,这是对管道的“修复”,对我来说,这意味着管道总是应该这样工作的。还是我用错了?

    我甚至有这个功能,工作得很好,我只是传递了一些“公共管道”,我想为每个请求执行:

    logIn(username: string, password: string, remember: boolean) {
      return this.http.post('/user/login', { username, password, remember })
        .pipe<User>(
          ...this.commonPipes(),
          map(resp => new User(resp.user)));
    }
    

    这一变化是 introduced in v6.3 它说它“修复”了管道的一些错误(它引用 this issue ). 我写“修复程序”是因为对我来说,它破坏了东西,它不向后兼容,而且我还没有找到一个“如何升级”指南来解释如何使用新的,修复的 pipe()

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

    问题是,spread语法只能在几个版本中使用,其中 pipe “已修复”。然而,这些“修复”基本上破坏了所有的类型检查 -更糟的是,它们又被还原和改变了。

    this issue ,使用扩展语法

    commonPipes 返回一个运算符数组,可以使用静态

    看看我的眼睛 Combining Operators 文章。