programing

http promise가 있는 typscript 모듈에서 "this"가 정의되지 않은 이유

goodsources 2023. 3. 22. 21:09
반응형

http promise가 있는 typscript 모듈에서 "this"가 정의되지 않은 이유

이것은 나의 첫 번째 활자이고 각진 시도이고 나는 한 가지 문제에 빠져있다.

모듈 컨트롤러는 다음과 같은 방법으로 정의되어 있습니다.

module app.controllers {
    "use strict"

    import services = app.services;

    export class calendarController {

        calBlock: any;
        deptId: number;
        calSvc: app.services.calendarService;

        static $inject = ["$scope", "calendarService"];

        constructor(isolateScope: directives.calendarScope, calSvc: services.calendarService) {

            this.deptId = isolateScope.deptId;
            this.calSvc = calSvc;

            calSvc.getMonthBlock(12, 2015, 1, this.deptId)
            .then(
                function (response) {
                    //promise fullfilled (regardless of outcome)                
                    this.calBlock = response.data;
                 },
                 function (error) {
                //handle errors
                    alert(error);
                 }   
             );
        }
    }
}

이 컨트롤러가 의존하는 서비스는 다음과 같습니다.

module app.services {
    "use strict"
    export class calendarService {

        private _http: ng.IHttpService;

        static $inject = ["$http"];

        constructor(http: ng.IHttpService) {
            this._http = http;            
        }

        getMonthBlock = function (month:number, year:number, calId:number, deptId:number) {

            //initialise service url
            var sURL = _sf.getServiceRoot('KrisisShifts') + "CalendarService/GetMonthCal/" + calId + "/" + deptId + "/" + month + "/" + year;
            //create config object for get function
            var config = {
                URL: sURL,
                method: "GET",
                dataType: 'json',
                headers: {
                    'ModuleId': _sf.getModuleId(),
                    'TabId': _sf.getTabId(),
                    'RequestVerificationToken': _sf.getAntiForgeryValue()
                }
            }
            //return the promise of the http.get function
            return this._http.get(sURL, config);

        }
    }
}

컨트롤러 모듈의 다음 라인에서 문제가 발생합니다.

this.calBlock = response.data;

문제는 THIS가 정의되어 있지 않기 때문에 calBlock도 정의되어 있지 않고 jsConsole에서 다음 오류가 발생한다는 입니다.

TypeError: shift-controller.defined?cdv=28:14에 정의되지 않은 속성 'calBlock'을 설정할 수 없습니다.

저는 javascript와 angular, typescript를 비교적 잘 모르기 때문에 왜 "this"가 정의되어 있지 않은지 잘 모르겠습니다.함수에 둘러싸여 있기 때문인 것 같습니다.

컨트롤러의 typscript 클래스의 calBlock 속성에 reponse.data($http 호출의 json 배열)를 할당하는 방법이 필요합니다.응답 기능 내에서 정의되지 않은 이유와 액세스 방법을 이해할 수 있는 사람이 있습니까?

감사해요.

편집: TYME 기반 솔루션JV의 답변

다시 쓴 calBlock 콜을 다음에 나타냅니다.

            calSvc.getMonthBlock(12, 2015, 1, this.deptId)
            .then((response) => {
                    //promise fullfilled (regardless of outcome)                
                    this.calBlock = response.data;
                },
            (error) => {
                    //handle errors
                    alert(error);
                }   
            );

왜냐하면 의 맥락은this콜백으로 손실됩니다.타이프스크립트에서 화살표 함수를 사용하여 컨텍스트를 보존합니다!

calSvc.getMonthBlock(12, 2015, 1, this.deptId).then((response) => {

})

언급URL : https://stackoverflow.com/questions/33851786/why-this-is-undefined-in-typescript-module-with-http-promise

반응형