服务内部的Null属性

时间:2019-12-10 14:03:45

标签: javascript angular

我有一个服务,它接收2个属性http和快餐,当在函数中调用快餐时,它是未定义的,但是当在构造函数中的控制台上打印时,它具有一个值。

这是我的服务

import { throwError as observableThrowError, empty as observableEmpty } from 'rxjs';

import { HttpResponseBase } from '@angular/common/http';
import { Injectable } from '@angular/core';

import { AuthHttp } from './auth-http';
import { Snacks } from './snacks/snacks.service';

@Injectable()
export class BaseService {
    private _http: AuthHttp;
    private _snack: Snacks;

    constructor(http: AuthHttp, snack: Snacks) {
        this._http = http;
        this._snack = snack;
    }

    ...

    protected handleError(error: any) {
        // In a real world app, you might use a remote logging infrastructure
        let errMsg: string;
        if (error instanceof Response || error instanceof HttpResponseBase) {
            if (error.status === 401 || error.status === 403 || error.status === 503) {
                return observableEmpty();
            }
            if (error.status === 400 || error.status === 404) {
                return observableThrowError(error);
            }
            const body = error || '';
            const err = body || JSON.stringify(body);
            errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
        } else {
            errMsg = error.message ? error.message : error.toString();
        }

        if (error.error.message) {
            this._snack.error(error.error.message);
        }

        return observableThrowError(error.error.data);
    }
}


有人知道为什么吗?

2 个答案:

答案 0 :(得分:3)

如何调用handleError?它很可能以使this指向窗口对象或其他对象的方式使用。在这种情况下,将handleError更改为箭头函数,因为它将this保留在方法主体内。

protected handleError = (error:any) => { 
   /* unchanged body of method from your question */
}

答案 1 :(得分:1)

您正在遵循Angular文档中的英雄服务示例。

更改:

   catchError(this.handleError)

对此:

   catchError(this.handleError.bind(this))
   // or this
   catchError((err, ob) => this.handleError(err))

这是代码示例中的错误,但是该示例有效,因为它们在示例中未引用this