2013-08-09 51 views
6

Tôi gọi một hàm với một callback như thế này:Tại sao gọi lại tôi nói "không xác định không phải là một chức năng

$(function() { 
    //get all the items 
    search.init('.result tbody tr'); 
    search.parseresults(function(announcementID){ 
     //query every single page 
     var myCompany = new company(announcementID); 
     myCompany.requestPage(function(){ 
      //on response parse the data. 
      myCompany.parsedata() 
      var myPerson = new person(myCompany) 
      myPerson.getPhone(function(){ 
       console.log('test') 
      }); 
     }) 
    }); 
}); 

Đó là callback ngoái với console.log ('test') đó là . vấn đề

đây là getPhone chức năng:

person.prototype.getPhone = function(callback){ 
    this.attempt++ 
    if(this.attempt === 1){ 
     var who = this.lastname; 
     var where = this.adress+' '+this.postal; 
    }else if(this.attempt === 2){ 
     var who = this.firstname+' '+this.lastname; 
     var where = this.adress+' '+this.postal; 
    }else{ 
     var who = this.firstname+' '+this.lastname; 
     var where = this.adress+' '+this.postal; 
     var url = 'http://personer.eniro.se/resultat/'+who+'/'+where; 
     console.debug('') 
     //console.debug('fail') 
     console.debug(url) 
     console.debug(this) 
     return 
    } 
    var self = this; 

    var url = 'http://personer.eniro.se/resultat/'+who+'/'+where; 
    GM_xmlhttpRequest({ 
     method: "GET", 
     url: url, 
     onload: function(data) { 
      data = $.parseHTML(data.response); 
      var vCard = $(data).find('.vcard') 
      if (vCard.length === 1){ 
       var phone = vCard.find('.tel.row a').map(function(){ 
        return this.text 
       }).get() 

       self.officePhone = phone[0]; 
       if(phone.length > 1){ 
        self.mobilePhone = phone[1]; 
       }else{ 
        self.mobilePhone = ''; 
       } 
       callback(); 

      } else if(vCard.length > 1){ 
       self.getPhone() 
      } 
     } 
    }) 
} 

các callback được kích hoạt khi nó nghĩ đến Nhưng khi gọi lại là hiện tại tôi nhận được lỗi:.

undefined is not a function

+1

Bạn có thể đơn giản hóa mã của bạn để bỏ qua các chi tiết không liên quan? Rất có thể, bạn sẽ tìm thấy vấn đề của bạn mình :) – andreister

Trả lời

9
else if(vCard.length > 1){ 
    self.getPhone() 
} 

Khi bạn đang thực hiện những nỗ lực tiếp theo, bạn sẽ không đi qua trên callback - sau đó là undefined trong cuộc gọi đó. Một nên luôn luôn kiểm tra xem một cuộc gọi lại là một chức năng trước khi gọi nó.

if (vCard.length === 1){ 
    var phone = vCard.find('.tel.row a').map(function(){ 
     return this.text 
    }).get() 

    self.officePhone = phone[0]; 
    if(phone.length > 1){ 
     self.mobilePhone = phone[1]; 
    }else{ 
     self.mobilePhone = ''; 
    } 
    // also pass some reasonable result: 
    if (typeof callback=="function") callback(phone); 

} else if(vCard.length > 1) { 
    self.getPhone(callback) 
} 
6

Không chắc nếu điều này là một vấn đề nhưng đó là một ý tưởng bắt đầu:

Trong dòng cuối cùng của bạn, bạn có self.getPhone(), nơi bạn không vượt qua một callback. Vì vậy, nếu bạn đạt đến mã này: callback(); theo phương pháp getPhone, callback có thể không được xác định.

Hãy thử:

if (typeof(callback) === 'function') { 
    callback() 
} 
Các vấn đề liên quan