为什么javascript setTimeout会同时执行所有操作?

时间:2012-05-18 10:23:16

标签: javascript jquery settimeout

我有这个代码,我不知道为什么一次调用循环中的所有函数!

this.line = function($l) {
    var $this = this;
    $this.$len = 0;
    $('.active').hide(0,function(){             
        $this.$len = $l.length;
        var j = 1;
        $.each($l,function(i,item){
            var t = setTimeout(function(){
                $this._echoLine($l[i]);
                clearTimeout(t);
                if (j >= $this.$len) $('.active').show();
                j++;
            },500*j);
        });
    });
}

2 个答案:

答案 0 :(得分:3)

这是因为你只在里面增加j 超时功能,但延迟时间(取决于j)在超时时仍为1处理程序已注册。

看到你有一个循环索引变量(i),试试这个:

$l.each(function(i, item) {
    setTimeout(function() {
        $this._echoLine($l[i]);
    }, 500 * (i + 1));
});

// a separate timeout to fire after all the other ones
setTimeout(function() {
    $('.active').show();
}, ($l.length + 1) * 500);

不需要clearTimeout行,因此无需声明或存储t

答案 1 :(得分:0)

希望它有效。

this.line = function($l) {
    var $this = this;
    $this.$len = 0;
    $('.active').hide(0,function(){             
        $this.$len = $l.length;
        var j = 1;
        $.each($l,function(i,item){
            var t = setTimeout(function(){
                $this._echoLine($l[i]);
                clearTimeout(t);
                if (j >= $this.$len) $('.active').show();
                j++;
            });
        });
    });
}

setTimeout(function() { this.line(); }, 500);