2017-10-22 7 views
1

나는이 같은 설정 간격으로 기능 한 -방법 참조에서 콜백 함수로 잡기는

RestClient = window.RestClient || {}; 

(function (w, rs) { 
    rs.invokeRemoteService = function (postData, successCallBack, errorCallBack){ //label-1, successCallback and errorCallback are undefined 

      $.ajax({ 
       url : '/some/url/', 
       dataType : "json", 
       data :{ 
        cmd: ko.toJSON(postData) 
       }, 
       type : "post", 
       async : true, 

       success : function(data) { //label-2, get data ok 
        if (typeof successCallBack === "function") { //label-3, successCallBack is undefined 
         successCallBack(data); //label-4 
        } 
       }, 
       error : function() { 
        if (typeof errorCallBack === "function") { 
         errorCallBack(); //label-5 
        } 
       } 

      }); 

    }; 
})(window, RestClient); 

- 여기

setInterval(function(){ 
    var postData = {'some json data'}; 

    var successCallback = function(data) { 
      console.log(data); 
    } 

    var errorCallback = function(data) { 
      console.log(data); 
    } 

    RestClient.invokeRemoteService(postData, this.successCallback, this.errorCallback); 

}, 10000); 

그리고는 (다른 파일에서) RestClient의에서 내 invokeRemoteService() 방법 그러나 setInterval() 메서드에서 RestClient.invokeRemoteService() 메서드를 호출하면 항상 successCallbackerrorCallback에 대해 label-1, label-3label-5에 '정의되지 않음'이 표시됩니다. 서비스 호출이 완벽하게 완료되었지만 올바른 데이터가 label-2. The RestClient.invokeRemoteService() work fine for other. But when I call it from setInterval()`에서 작동하지 않습니다. 도와주세요.

답변

2

this은 필요하지 않으며 사용자의 successCallbackerrorCallback은 직접 해당 범위에 속합니다.

setInterval(function(){ 
    var postData = {'some json data'}; 

    var successCallback = function(data) { 
      console.log(data); 
    } 

    var errorCallback = function(data) { 
      console.log(data); 
    } 

    RestClient.invokeRemoteService(postData, successCallback, errorCallback); 

}, 10000); 
+0

감사합니다. 하지만 저는 자바 스크립트를 처음 사용하기 때문에 'this'를 사용할 때 왜 작동하지 않는지 이해할 수 없습니다. 약간 설명해 주실 수 있습니까? – Razib

+1

'this'는 함수 호출자 _context_에 접근하기 위해 사용됩니다. 대부분의 경우 전역 컨텍스트 ('window')이며 함수가 객체 메소드 인 경우 해당 객체 인스턴스입니다. 귀하의 경우에는 _scope_/_closure_의 변수를 참조하려고하는데, 이는 'this'를 사용하지 않고 직접 수행됩니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this 및 https://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work를 참조하십시오. – ghybs