Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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中使用time.js和for循环只输出数组中的最终值_Javascript_For Loop_Foreach - Fatal编程技术网

尝试在javascript中使用time.js和for循环只输出数组中的最终值

尝试在javascript中使用time.js和for循环只输出数组中的最终值,javascript,for-loop,foreach,Javascript,For Loop,Foreach,我使用一个名为timer.js的库,因为我想循环一个数组,但希望在迭代之间有一个延迟 这是指向库的github的链接: 我所做的是从timer.js的min版本创建一个文件,并在我的主js文件之前的html正文中链接到它,如下所示: <script src="./timer.js" charset="utf-8"></script> <script src="./script.js" charset="utf-8"></script> 然后,

我使用一个名为timer.js的库,因为我想循环一个数组,但希望在迭代之间有一个延迟

这是指向库的github的链接:

我所做的是从timer.js的min版本创建一个文件,并在我的主js文件之前的html正文中链接到它,如下所示:

<script src="./timer.js" charset="utf-8"></script>
<script src="./script.js" charset="utf-8"></script>

然后,在主js文件中,我创建了一个数字数组,我只想在console.logs之间有一个间隔的时候遍历它们:

var timer = new Timer();

var nums = [1,2,3,4]

for (var i = 0; i < nums.length; i++){
  timer.start(5).on('end', function(){
    console.log(i);
  })
}
var timer=new timer();
var nums=[1,2,3,4]
对于(变量i=0;i
当我打开控制台日志时,只记录了一个“4”。为什么for循环不适用于其他索引。还有,有没有办法用forEach函数重新创建它

多谢各位

我想循环一个数组,但希望在迭代之间有一个延迟

根据迭代设置持续时间:

duration*iteration
setTimeout可以实现延迟,持续时间以毫秒为单位,比如说2秒(2000ms),让我们在迭代中添加1,这样它就有了第一次迭代的延迟:

duration*iteration
const nums=[1,2,3,4]
nums.forEach((n,i)=>{
设置超时(()=>(
控制台日志(i)
),2000*(i+1))
});
我想循环一个数组,但希望在迭代之间有一个延迟

根据迭代设置持续时间:

duration*iteration
setTimeout可以实现延迟,持续时间以毫秒为单位,比如说2秒(2000ms),让我们在迭代中添加1,这样它就有了第一次迭代的延迟:

duration*iteration
const nums=[1,2,3,4]
nums.forEach((n,i)=>{
设置超时(()=>(
控制台日志(i)
),2000*(i+1))

});在处理异步代码时,您遇到了一些常见的陷阱

首先要认识到的是,for循环并不是等待每个迭代完成。它只需调用
timer.start(5)
四次,尽可能快。为此,不能使用for循环。你最好的选择是使用非常流行的库中的内容

要意识到的第二件事是,在同一个实例上反复调用
start(5)
,导致每次重置为5秒。因此,在循环完成五秒钟后,只调用一个计划回调。这实际上不是对异步代码的误解,而是对
timer.js
库本身的误解。您可以通过在循环中创建新的计时器来解决这个问题,但是对于您的情况,
timer.js
有点过头了。通过本机
setTimeout
调用,您可以完全执行您想要的操作

要意识到的第三件事是,您发送到
on()
的回调没有存储
i
的当前值。它只存储对该变量的引用,因此对该变量的任何更改最终都将反映在日志中


在循环的最后一次迭代中,
i
的值实际上是3,而不是4。这是因为4不是
,在处理异步代码时,您会遇到一些常见的陷阱

首先要认识到的是,for循环并不是等待每个迭代完成。它只需调用
timer.start(5)
四次,尽可能快。为此,不能使用for循环。你最好的选择是使用非常流行的库中的内容

要意识到的第二件事是,在同一个实例上反复调用
start(5)
,导致每次重置为5秒。因此,在循环完成五秒钟后,只调用一个计划回调。这实际上不是对异步代码的误解,而是对
timer.js
库本身的误解。您可以通过在循环中创建新的计时器来解决这个问题,但是对于您的情况,
timer.js
有点过头了。通过本机
setTimeout
调用,您可以完全执行您想要的操作

要意识到的第三件事是,您发送到
on()
的回调没有存储
i
的当前值。它只存储对该变量的引用,因此对该变量的任何更改最终都将反映在日志中


在循环的最后一次迭代中,
i
的值实际上是3,而不是4。这是因为4不是调用
计时器的
。同时启动(5)
4次,所以在
5
时间单位之后,它应该控制台.log 4次,到那时,
i
将是4次。该库做了什么,而你不能用setTimeout或setInterval执行?这是JavaScript中非常常见的错误。您不能在这样的for循环中实例化函数,它不能像您预期的那样工作,因为调用
timer.start(5)
的函数可能会重复4次,因此在
5
时间单位之后,它应该console.log 4次,到那时,
i
将为4。该库做了什么,而setTimeout或setInterval做不到?这是JavaScript中非常常见的错误。您不能像这样在for循环中实例化函数,它不能像您预期的那样工作,它的可能重复将产生类似的结果,但是理解forEach不会在迭代之间等待是至关重要的。它只是一次调度所有日志,每个日志都有成倍的延迟。这将产生类似的结果,但关键是要理解forEach不会在迭代之间等待。这只是一次安排所有日志,每个日志都有成倍的延迟。嗨,你能不能写一个承诺版本,我可以在我的浏览器中尝试?你可以像在浏览器中一样尝试。你只需要先加入这个脚本:不过我会继续做一个有承诺的脚本。我会用另一个图书馆