javascript中重复函数的最佳方法是什么?
我正在做一些类似“网络进化模型”的可视化工作。javascript中重复函数的最佳方法是什么?,javascript,repeat,Javascript,Repeat,我正在做一些类似“网络进化模型”的可视化工作。 基本算法是: 一些初始化操作 100个进化步骤 一些操作 100个进化步骤 其他一些行动 100个进化步骤 从第一步开始(即初始操作) 因此,基本上,我必须重复100个进化步骤3次,在这两个步骤之间要进行独特的操作,然后再从头开始 我当前的代码结构如下: var timer; var counter; function bigFunction() { function hundredSteps() { // code
基本算法是:
- 一些初始化操作
- 100个进化步骤
- 一些操作
- 100个进化步骤
- 其他一些行动
- 100个进化步骤
- 从第一步开始(即初始操作)
var timer;
var counter;
function bigFunction() {
function hundredSteps() {
// code for single step
timer = setTimeout(hundredSteps(), 10);
counter++;
stage++;
if (counter >= 100) {
clearTimeout(timer);
counter = 0;
nextStage(stage);
}
}
function nextStage(stage) {
if (stage == 1) {
// 1st step code, some init operations
timer = setTimeout(hundredSteps(), 10);
}
if (stage == 2) {
// 2nd step code, some operations
timer = setTimeout(hundredSteps(), 10);
}
if (stage == 3) {
// 3rd step code, some other operations
stage = 0;
timer = setTimeout(hundredSteps(), 10);
}
}
var stage = 1;
counter = 0;
nextStage(stage);
}
所以我想问:这是一种“正确”的方式来编码我想要实现的目标吗?或者人们通常会采取不同的做法吗 要使用设置超时,您需要将函数放入,但不调用它。像这样:
setTimeout(hundredSteps, 10)
或
比如说,我会把它清理干净一点。在您的问题中,您有一个使用计数器递增的阶段,在下一步函数中它应该递增。您还可以使用一个变量来跟踪计时器(如果不完全需要)
下面是一个工作示例:
您希望将每一步延迟10毫秒的原因是什么?您将向setTimeout传递一百步的结果,即nothing,而不是函数本身。你也在用一种递归的方式来调用事物“那将爆炸”,类似于atm.inside of hundredSteps()你递增stage,但我认为出于可读性的原因,你可能应该在if语句中递增它。。。除此之外,您基本上实现了一个状态机(这不一定是一件坏事),但我会小心将它变成一个habit@JackFrankland是的,没有延迟,浏览器挂断,因此需要延迟以确保一切正常工作,我想。@user3572842:当
hundredSteps
递增stage
时,使用setTimeout
的问题是hundredSteps
和stage
可能会不同步setTimeout
使代码异步,这意味着当您等待10毫秒时,代码将在该时间范围内移动很多。您需要管理stage
外部hundredSteps
以防止该问题。看起来它会起作用。这应该是一个注释+1:看起来setTimeout
可能不会导致stage
和hundredSteps
不同步,因为stage
在nextStage
函数中递增。我唯一要更改的是不要在开关外部调用hundredSteps
,因为当阶段为3
时,它也会调用它。它永远不会转到3,案例3会将其重置为0@MBottens:stage
在全局范围内(或者在bigFunction
范围内的OPs更新代码的情况下)因此bigFunction
范围内的任何代码,或者在您的代码示例中的全局范围内,都可以随时将其更改为任何值,从而导致代码中断。啊,我明白了。好的提示:)我只是不太喜欢多次键入同一行,但也许在超时时使用一个好的if语句可以解决这个问题
setTimeout(function() {
hundredSteps()
}, 10)
var counter = 0,
stage = 1
var hundredSteps = function() {
counter++
//Your code here
if (counter >= 100) {
counter = 0
nextStage()
} else {
window.setTimeout(hundredSteps, 10)
}
}
var nextStage = function() {
switch (stage) {
case 1:
//Your code here
console.log("Stage one activated")
break
case 2:
//Your code here
console.log("Stage two activated")
break
case 3:
//Your code here
stage = 0
console.log("Stage three activated")
break
}
stage++
window.setTimeout(hundredSteps, 10)
}
nextStage()