为什么我的回调说“未定义不是函数?

时间:2013-08-09 12:35:50

标签: javascript jquery

我正在使用这样的回调调用函数:

$(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')
            });
        })
    });
});

这是最后一次使用console.log('test')回调问题。

这是getPhone函数:

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()
            }
        }
    })
}

回调会在它应该被触发时被触发。但是当回调存在时,我得到错误:

  

undefined不是函数

2 个答案:

答案 0 :(得分:9)

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

当你正在进行下一次尝试时,你没有传递callback - 然后在该调用中未定义。在调用它之前,应该总是测试回调是否是一个函数。

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)
}

答案 1 :(得分:6)

不确定这是否是一个问题,但这是一个开始的想法:

在你的最后一行,你有self.getPhone(),你没有通过回调。 因此,如果您在callback();方法中找到此代码:getPhonecallback可能未定义。

尝试:

if (typeof(callback) === 'function') {
    callback()
}