Reputation: 15006
I'm calling a function with a callback like this:
$(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')
});
})
});
});
It's the last callback with console.log('test') that is the problem.
this is the getPhone-function:
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()
}
}
})
}
The callback gets triggered when it's supposed to. But when the callback is present I get the error:
undefined is not a function
Upvotes: 6
Views: 9764
Reputation: 14455
Not sure if this is a problem but it's a starting idea:
In your last line you have self.getPhone()
, where you do not pass a callback.
So, if you reach this code: callback();
in the getPhone
method, callback
may be undefined.
Try:
if (typeof(callback) === 'function') {
callback()
}
Upvotes: 6
Reputation: 664246
else if(vCard.length > 1){ self.getPhone() }
When you're doing the next attempt, you're not passing on the callback
- then is undefined in that call. One should always test whether a callback is a function before invoking it.
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)
}
Upvotes: 9