Должен ли оператор фильтра Rxjs 6 работать с возвратом от оператора карты? - PullRequest
1 голос
/ 13 мая 2019

У меня была следующая функция:

Исходная функция

public FindCertType(CertTypeID: string) : Observable<ICertType> {
    console.log("... FindCertType in Model-tools.service called ...");
    return this.GetCertTypes()
      .pipe(
        map((CertTypeMap: IResponseObject<ICertType>) => {
          return CertTypeMap.Array
        }),
        filter((CertType: ICertType ) => CertType.Id === CertTypeID)[0]
      )
  }

Этот код привел к следующей ошибке:

Ошибка консоли

... ShowCertType called ...                           new-bcaba.component.ts:27 
... GetCertType in Certification Component called ... certification.component.ts:49
... FindCertType in Model-tools.service called ...                  model-tools.service.ts:53
... GetCertTypes in Model-tools.service called ...                  model-tools.service.ts:48

ERROR TypeError: fn is not a function                  NewBcabaComponent.html:3
    at pipe.js:18
    at Array.reduce (<anonymous>)
    at piped (pipe.js:18)
    at Observable.push../node_modules/rxjs/_esm5/internal/Observable.js.Observable.pipe (Observable.js:91)
    at ModelToolsService.push../src/app/_services/model-tools.service.ts.ModelToolsService.FindCertType (model-tools.service.ts:55)
    at NewBcabaComponent.push../src/app/certification/certification.component.ts.CertificationComponent.GetCertType (certification.component.ts:50)
    at NewBcabaComponent.get [as BaseCertType$] (certification.component.ts:54)
    at NewBcabaComponent.push../src/app/certification/application/new-bcaba/new-bcaba.component.ts.NewBcabaComponent.ShowCertType (new-bcaba.component.ts:28)
    at NewBcabaComponent.get [as ParentCertType$] (new-bcaba.component.ts:37)
    at Object.eval [as updateDirectives] (NewBcabaComponent.html:3)

Когда я изменил функцию, чтобы фильтр был встроен в карту, ошибка исчезла, и она заработала, как я и ожидал.

Модифицированная функция

public FindCertType(CertTypeID: string) : Observable<ICertType> {
    console.log("... FindCertType in Model-tools.service called ...");
    return this.GetCertTypes()
      .pipe(
        map((CertTypeMap: IResponseObject<ICertType>) => {
          return CertTypeMap.Array.filter(CertType => CertType.Id === CertTypeID)[0];
        })
      )
  }

Хотя моя проблема была решена с помощью модификации, я не понимаю, почему это работает, но первая версия не работает. Я импортировал операторы «filter» и «map» из «rxjs / operator» для исходного кода, и, как я понимаю, операторы внутри pipe должны работать с возвращаемыми значениями, наблюдаемыми от предыдущего оператора, поэтому фильтр должен работать при возврате map. Кто-нибудь может объяснить, почему это не работает?

...