2012-10-13 165 views
0
異步調用

我有一個類的定義如下代碼範圍,在Javascript

var class1 = function() { 
    this.classData = 'value1'; 
    this.func1 = function(callback) { 
     $.ajax({ 
      'url': '/somewhere', 
      'dataType': 'json', 
      'type': 'POST', 
      'data': { 
       options: 'some text' 
      }, 
      'success': function (data, textStatus, jqXHR) { 
       callback(data); // <<<<<< THIS LINE 
      } 
     }); 
    }; 
}; 

,然後我把這樣的

var obj1 = new class1(); 
obj1.func1(function (d) { 
    this.classData = d; 
}); 

類但這似乎不工作因爲在成功函數中,當在上面代碼中標記的行調用回調函數時,它的this對象指向window而不是obj1值。

我在做什麼錯在這裏,我該如何解決它?

回答

1

這不是一個範圍問題,而是一個上下文問題。 this,當你的函數被調用時,是調用函數時的接收者,而不是對象obj1

這樣做:

var obj1 = new class1(); 
obj1.func1(function (d) { 
    obj1.classData = d; 
}); 

這是正確的方式。

如果你的回調都意味着有1類爲接收器的情況下,您也可以這樣做:

var class1 = function() { 
    this.classData = 'value1'; 
    var _this = this; 
    this.func1 = function(callback) { 
     $.ajax({ 
      'url': '/somewhere', 
      'dataType': 'json', 
      'type': 'POST', 
      'data': { 
       options: 'some text' 
      }, 
      'success': function (data, textStatus, jqXHR) { 
       _this.callback(data); // note that I call the callback on the instance of obj1 
      } 
     }); 
    }; 
}; 
+0

事情是我希望我這是Class 1的對象的正確實例.. .. 所以如果我有對象的多個實例...那麼我想回調編輯它已被調用的一個! – subzero

+0

我的建議有問題嗎?無論如何,我添加了一個替代方案。更有意義的 –

+0

...謝謝... – subzero