每个对象实例的setTimeout

时间:2013-04-03 15:26:01

标签: javascript jquery

我有这个对象(这只是它的一部分,很明显......):

function room() {
    this.data = {
        sender_name: '',
        room_id: 0
    }
    this.create = function (sender_name) {
        // (code to set this.data)
        this.removeTimer();
    }
    this.removeTimer = function() {
        var t = this;
        console.log(t.data.sender_name) // log #1

        $.tGet('roomInfo', {'room_id': this.data.room_id}, function(edata) {
            console.log(t.data.sender_name) // log #2
            if(edata.exists == 'false') {
                // remove room code...
            }
            else {
                setTimeout(function() {
                    t.removeTimer();
                }, 1000)
            }
        })
    };
}

我从DB创建它的实例:

$.tGet('getRooms', {'user_id': mUser}, function(edata) {
    var i = 0, n;
    for(i = 0; i<edata.length; i++) {
        n = new room();
        n.create(edata[i].sender_name);
    }
})

现在,问题是控制台打印的只是最后创建的房间。我不知道发生了什么......

第一次运行此代码时,日志#1完全正确。但是,log#2已经存在问题,因为它只给我DB中的最后一个空间(或循环...),当然,在超时日志#1也出错之后。

发生了什么事?我真的只是javascript的初学者,所以......


tGet功能:

$.tGet = function(action, data, callback, error) { 
    $.get('php/ajax.php?action='+action, data, callback, 'json').fail(error); 
} 

2 个答案:

答案 0 :(得分:0)

this.removeTimer = function() {
    console.log(this.data.sender_name) // log #1

    $.tGet('roomInfo', {
                'room_id': this.data.room_id,
                'instance' : this
            }, function(edata) {
        console.log(this.instance.data.sender_name) // log #2
        if(edata.exists == 'false') {
            // remove room code...
        }
        else {
            setTimeout(function() {
                instance.removeTimer();
            }, 1000)
        }
    })
};

答案 1 :(得分:-1)

看起来您正在使用相同的房间ID创建多个房间实例。创建行应该是n.create(edata[i].room_id)