instanceof возвращает false для класса детей - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать обработку ошибок для моего приложения. Я создал базовый класс с именем AppError. У меня есть конкретные классы ошибок, расширяющие класс AppError. Например, класс BadInput для состояния ошибки 400. Я использую instanceof для распознавания класса объекта. Но obj instanceof BadInput всегда возвращает false, даже если я создаю экземпляр класса BadInput. Мой код выглядит следующим образом:

приложение-error.ts

export class AppError {
    constructor (public originalError?: any) {
        console.log(originalError);
    }
}

дурные-input.ts

import { AppError } from './app-error';

export class BadInput extends AppError {
    constructor (public originalError?: any) {
        super(originalError);
    }
}

Данные-service.service.ts

// import statements

export class DataService {
  private _baseUrl = 'dummy.com'

  constructor(private _http: Http) {}

  get http() {
    return this._http;
  }

  makePostRequest (urlSubpath: string, body: Object) {
    return this._http.post(this._baseUrl + urlSubpath, JSON.stringify(body), this.getOptions())
              .map (response => response.json());
  }

  protected handleError(error: Response) {
    if (error.status === 400) {
      return Observable.throw (new BadInput (error.json()));
    } else if (error.status === 404) {
      return Observable.throw (new NotFoundError ());
    } else if (error.status === 500) {
      console.log ('in 500 handling...');
      return Observable.throw (new BadInput (error.json()));
    }

    return Observable.throw (new AppError (error.json()));
  }
}

Обратите внимание на строку return Observable.throw (новый BadInput (error.json ())); пару раз в handleError ()

otp.service.ts

// import statements
@Injectable()
export class OtpCheckerService extends DataService {

  constructor(http: Http) {
    super(http);
   }

   check(body) {
    return super.makePostRequest('Api/VerifyMobile', body)
      .catch(this.handleError);
  }
}

otp.component.ts

// Only providing required code

submit() {
    const body = {
      UserId: this._user.id,
      OTP: this.otp.value
    };

    this._spinner.show ();

    this._otpCheckerService.check(body).subscribe(
      response => {
        this._user.isSignedIn = true;
        this._router.navigate(['/checkout']);
      },
      (error: AppError) => {
        this._spinner.hide();
        if (error instanceof BadInput) {
          console.log ('handling bad input..');
          this._isOtpWrong = true;
        } else {
          throw error;
        }
      },
      () => {
        this._spinner.hide();
      }
    );
  }

Я пропустил некоторый код для краткости, но если вам нужно, я могу поместить код здесь.

Обновление 1:

Я изменил submit () в otp.component.ts, чтобы посмотреть, не участвует ли мой глобальный обработчик ошибок в этом. Обновленный метод отправки выглядит следующим образом:

submit() {
    const body = {
      UserId: this._user.id,
      OTP: this.otp.value
    };

    this._spinner.show ();

    this._otpCheckerService.check(body).subscribe(
      response => {
        this._user.isSignedIn = true;
        this._router.navigate(['/checkout']);
      },
      (error: AppError) => {
        this._spinner.hide();
        if (error instanceof BadInput) {
          console.log ('handling bad input..');
          this._isOtpWrong = true;
        } else if (error instanceof AppError) {
          console.log ('handling app error..');
        } else {
          throw error;
        }
      },
      () => {
        this._spinner.hide();
      }
    );
  }

Обратите внимание, я проверяю Ошибка экземпляра AppError . Это также возвращает ложь. И глобальный обработчик ошибок обрабатывает ошибку. Мой глобальный обработчик ошибок выглядит следующим образом:

import { ErrorHandler } from '@angular/core';

export class AppErrorHandler implements ErrorHandler {
    handleError(error: any): void {
        console.log(error);
        alert ('Sorry. An unexpected error occured. Our engineers are fixing it.');
    }
}

1 Ответ

0 голосов
/ 30 апреля 2018

Вот, пожалуйста. Очевидно, что вы получаете не JSON (по крайней мере, когда есть ошибка), как следствие, ваш метод handleError при вызове error.json() выдает исключение. Это исключение (объект Error) - это то, что вы получаете в своей подписке, а не один из ваших Error классов.

Я бы предложил сделать что-то вроде этого:

protected handleError(error: Response) {
    try {
        if (error.status === 400) {
            return Observable.throw (new BadInput (error.json()));
        } else if (error.status === 404) {
            return Observable.throw (new NotFoundError ());
        } else if (error.status === 500) {
            console.log ('in 500 handling...');
            return Observable.throw (new BadInput (error.json()));
        }

        return Observable.throw (new AppError (error.json()));
    } catch (err) {
        return Observable.throw(new AppError({
           message: err.message,
           stackTrace: err.stack
        }
    }
}

Таким образом, вы можете захватить ЛЮБОЕ исключение и получить один из ваших классов, если вы этого хотите. В любом случае, теперь вы знаете причину, по которой ваша проверка типов не удалась.

...