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-1label-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

ありがとうございます!しかし、私はjavascriptを初めて使っているので、なぜ私が '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

関連する問題