尝试在javascript中使用time.js和for循环只输出数组中的最终值
我使用一个名为timer.js的库,因为我想循环一个数组,但希望在迭代之间有一个延迟 这是指向库的github的链接: 我所做的是从timer.js的min版本创建一个文件,并在我的主js文件之前的html正文中链接到它,如下所示:尝试在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> 然后,
<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不会在迭代之间等待。这只是一次安排所有日志,每个日志都有成倍的延迟。嗨,你能不能写一个承诺版本,我可以在我的浏览器中尝试?你可以像在浏览器中一样尝试。你只需要先加入这个脚本:不过我会继续做一个有承诺的脚本。我会用另一个图书馆