Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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_Repeat - Fatal编程技术网

javascript中重复函数的最佳方法是什么?

javascript中重复函数的最佳方法是什么?,javascript,repeat,Javascript,Repeat,我正在做一些类似“网络进化模型”的可视化工作。 基本算法是: 一些初始化操作 100个进化步骤 一些操作 100个进化步骤 其他一些行动 100个进化步骤 从第一步开始(即初始操作) 因此,基本上,我必须重复100个进化步骤3次,在这两个步骤之间要进行独特的操作,然后再从头开始 我当前的代码结构如下: var timer; var counter; function bigFunction() { function hundredSteps() { // code

我正在做一些类似“网络进化模型”的可视化工作。
基本算法是:

  • 一些初始化操作
  • 100个进化步骤
  • 一些操作
  • 100个进化步骤
  • 其他一些行动
  • 100个进化步骤
  • 从第一步开始(即初始操作)
因此,基本上,我必须重复100个进化步骤3次,在这两个步骤之间要进行独特的操作,然后再从头开始

我当前的代码结构如下:

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