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

为什么javascript setTimeout会同时执行所有操作?,javascript,jquery,settimeout,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

我有这个代码,我不知道为什么循环中的所有函数都会同时被调用

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

这是因为在超时函数中只增加了
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

这是因为在timeout函数中只增加
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

希望它能工作

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);
希望它能起作用

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


你不会将任何时间传递给内部超时。。。故意的?我不明白这个概念@别担心,不仅仅是你。此代码不起作用。很抱歉出错。我编辑了代码。将timeout设置为main函数,这样它就可以解决您的问题。@zonf不,它仍然不能工作。根据Felix的评论,您从未在对
setTimeout
的内部调用上设置超时。您没有向内部超时传递任何时间。。。故意的?我不明白这个概念@别担心,不仅仅是你。此代码不起作用。很抱歉出错。我编辑了代码。将timeout设置为main函数,这样它就可以解决您的问题。@zonf不,它仍然不能工作。根据Felix的评论,您从未在对
setTimeout
的内部调用上设置超时。我需要确定是否调用了超时中的函数!我该怎么做?@XIII:这和超时的速度有什么关系?也许你应该解释一下你到底想做什么。寻求问题的解决方案通常比寻求解决方案要好。我需要一个接一个地调用函数队列,我不能使用回调。@XIII为什么不能使用回调?这是在Javascript中触发“以后”操作的唯一方法。您的现有代码正在使用回调!这是一种动画。但在我的代码中,所有这些都在同一时间运行!我需要确定超时中的函数是否被调用!我该怎么做?@XIII:这和超时的速度有什么关系?也许你应该解释一下你到底想做什么。寻求问题的解决方案通常比寻求解决方案要好。我需要一个接一个地调用函数队列,我不能使用回调。@XIII为什么不能使用回调?这是在Javascript中触发“以后”操作的唯一方法。您的现有代码正在使用回调!这是一种动画。但在我的代码中,所有这些都在同一时间运行!