Метод не существует при использовании в разделе подписки Angular - PullRequest
1 голос
/ 26 февраля 2020
  1. Angular: вызов метода двух сервисов с помощью forkJoin
  2. Попробуйте обработать результат в другом методе подписки
  3. Наконец, вызовите другой метод из метода процесса
  4. и получая ошибку, этот метод не существует

Вот код:

onLoad(){
  forkJoin([
    this.service1.getData(),
    this.service2.fetchData(id)
  ]).subscribe(
    this.processData,
    errors => { this.error = true; }, 
    () => { this.loading = false; })
};

processData(response: any){
   recordA = response[0];
   recordB = response[1];
   this.validateData(recordB);
}

validateData(record: any) {
  ... some code here ...
}

Примечание: оба сервиса возвращают результат правильно, я проверяю данные.

Вот ошибка:

ОШИБКА TypeError: this.validateData не является функцией в SafeSubscriber.pu sh .. / projects / pathToComponentnst / xyzComponent.processData [as _next]

100% уверен, что метод существует и работает для других методов, но только в этом сценарии он не работает. Что такое SafeSubscriber.pu sh там есть ошибка?

Просто воспроизведите здесь то же самое https://stackblitz.com/..., откройте консоль, чтобы увидеть ошибку!

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Когда вы делаете это:

.subscribe(
    this.processData,
    ...

, это меняет область действия processData, а новая область не имеет метода validateData. Вы должны обернуть его в функцию стрелки, чтобы сохранить область действия:

.subscribe(
    response => this.processData(response),
    ...

или использовать bind:

.subscribe(
    this.processData.bind(this),
    ...

Вот фрагмент кода, демонстрирующий поведение:

class MyClass {
  constructor () {
    this.funcOne(() => this.funcTwo()) // works
    this.funcOne(this.funcTwo.bind(this)) // works
    this.funcOne(this.funcTwo) // what you're doing, doesn't work
  }
  
  funcOne (func) {
    func()
  }
  funcTwo () {
    this.funcThree()
  }
  funcThree () {
    console.log("success")
  }
}

new MyClass()
0 голосов
/ 26 февраля 2020

вам не нужно передавать processData аргумент. в противном случае validateData не имеет ничего для проверки.

...