Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript循环中等待_Javascript_Loops_Delay_Wait - Fatal编程技术网

在Javascript循环中等待

在Javascript循环中等待,javascript,loops,delay,wait,Javascript,Loops,Delay,Wait,我有一个这样设置的函数 awesomeFirePenguin: function(){ // function does some stuff, not important }, for (var i = 0; i < n; i++){ this.awesomeFirePenguin(); } 我把它叫做这样的for循环 awesomeFirePenguin: function(){ // function does some stuff, no

我有一个这样设置的函数

awesomeFirePenguin: function(){
   // function does some stuff, not important
},
for (var i = 0; i < n; i++){
   this.awesomeFirePenguin();           
}
我把它叫做这样的for循环

awesomeFirePenguin: function(){
   // function does some stuff, not important
},
for (var i = 0; i < n; i++){
   this.awesomeFirePenguin();           
}
我试着用

for (var i = 0; i < n; i++){
    window.setTimeout(this.awesomeFirePenguin(), 100);
}
和window.setIntervalthis.awesomeFirePenguin,100;,但是这两个函数都只执行一次。

setTimeout和setInterval可以将函数作为参数,但您所做的是调用它们。因此,他们接收的不是函数,而是作为参数的返回值

如果要延迟堆栈,可以将超时延迟乘以当前所在的循环索引

for (var i = 0; i < n; i++){
    window.setTimeout(this.awesomeFirePenguin.bind(this), 100 * i);
}
setTimeout和setInterval可以将函数作为参数,但您所做的是调用它们。因此,他们接收的不是函数,而是作为参数的返回值

如果要延迟堆栈,可以将超时延迟乘以当前所在的循环索引

for (var i = 0; i < n; i++){
    window.setTimeout(this.awesomeFirePenguin.bind(this), 100 * i);
}
答案可能是最简单的。您还可以使用异步执行库,如,在其中您可以将代码编写为:

var clumpy = new Clumpy({delay: 100});
var i;
clumpy.for_loop(
    function() { i = 0; },
    function() { return i < n; },
    function() { ++i; },
    this.awesomeFirePenguin
);
可以使用setInterval而不是setTimeout来编写一些东西,但这并不容易理解,尽管它可能消除了递归调用。

可能是最简单的。您还可以使用异步执行库,如,在其中您可以将代码编写为:

var clumpy = new Clumpy({delay: 100});
var i;
clumpy.for_loop(
    function() { i = 0; },
    function() { return i < n; },
    function() { ++i; },
    this.awesomeFirePenguin
);

可以使用setInterval而不是setTimeout来编写某些内容,但这并不容易理解,尽管它可能会消除递归调用。

可能需要包装函数或使用.bind来保留上下文this@finrod:没问题,欢迎来到StackOverflow!如果还没有,请查看quick.bind,这可能是包装函数或使用.bind来保留上下文所必需的this@finrod:没问题,欢迎来到StackOverflow!如果您还没有,请查看quick。我的问题的独特之处在于我设置函数的方式,我无法更改。如果我在另一个问题中使用解决方案,我会在问题的结尾描述我的问题。我的问题的独特之处在于我设置函数的方式,我无法改变这一点。如果我在另一个问题中使用解决方案,我会在我的问题的结尾描述我的问题。递归的好,有趣的用法。递归的好,有趣的用法。