当前位置: 首页 > 知识库问答 >
问题:

我如何防止无尽的循环,而循环在行动创建者?

裴姚石
2023-03-14

试图实现某种游戏循环,直到满足条件。

然而,在测试过程中,我无法解决while循环不等待promise的解决的问题,相反,它只是一次又一次地调用它们,导致浏览器崩溃。

安装组件时调用combatStart()

export const combatStart = () => {
    return function (dispatch, getState) {

        while (getState().mechanics.noOfEnemiesAttacked < 5) {
            let setTimeoutPromise = new Promise(resolve => {
                let success = true;
                setTimeout(function () { resolve(success) }, 3000);
            })

            setTimeoutPromise.then((resp) => {
                if(resp){
                    dispatch({
                        type: 'INCREMENT_ENEMIES_ATTACKED'
                    })
                }

            })
       }
    }
}

当我分派动作时,“noOfEnememesAttked”递增,当它达到5时,循环应该停止。所以它应该持续大约15秒。

代码一直工作到我添加while循环为止,否则它会按预期工作,在安装组件3秒后增加值。

我怎样才能让这个工作?

递归不起作用,它不循环,只运行一次:

export const combatStart = () => {
    return function (dispatch, getState) {
        let setTimeoutPromise = new Promise(resolve => {
            let success = true;
            setTimeout(function () { resolve(success) }, 2000);
        })

        setTimeoutPromise.then((resp) => {
            if (resp) {
                dispatch({
                    type: 'INCREMENT_ENEMIES_ATTACKED'
                })
            }
            if (getState().mechanics.noOfEnemiesAttacked < 5) {
                console.log(getState().mechanics.noOfEnemiesAttacked)
                combatStart();
            }
        })

    }
}

共有1个答案

臧亦
2023-03-14

将它包装在函数中,现在应该可以工作了

export const combatStart = () => {
    return function (dispatch, getState) {
        function foo(){
            let setTimeoutPromise = new Promise(resolve => {
                let success = true;
                setTimeout(function () { resolve(success) }, 2000);
            })

            setTimeoutPromise.then((resp) => {
                if (resp) {
                    dispatch({
                        type: 'INCREMENT_ENEMIES_ATTACKED'
                    })
                }
                if (getState().mechanics.noOfEnemiesAttacked < 5) {
                    console.log(getState().mechanics.noOfEnemiesAttacked)
                    combatStart();
                    foo();
                }
            })
        }

        foo();
    }
}
 类似资料:
  • 我正在尝试使我的循环回到列表的开始。 这是我当前用来检测列表末尾的东西(在这里找到): 当滚动到最后时,我希望视图在显示列表顶部的数据时是可见的,或者当滚动到列表顶部时,我将显示列表底部的数据。 例如: 视图5视图1视图2视图3视图4

  • 我有三块地 小时——分钟——和总数 如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。 例子: 1h 30分钟=1.5总计 2.25总计=2h 15分钟 我正试图用手表来达到这个目的 但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?

  • 我搜索了Google、StackOverflow和Github问题,但没有找到任何内容 https://docs.temporal.io/docs/java-implementing-workflows#child-workflows 似乎我可以轻松地创建一个包含多个工作流的圆圈,将其他人称为子工作流。工作流甚至可以一遍又一遍地调用自己。节奏/时间是否提供任何东西来防止这种情况或超出范围? 提前感

  • 问题在代码的注释中,很抱歉,我认为它更整洁,因为流程很重要,我想。。。 //*这是来自Oracle:(https://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#hasNextInt()) ”hasNextInt 公共布尔值hasnetint() 如果此扫描仪输入中的下一个标记可以使用nextInt()方法解释为默认基数中的in

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 问题内容: 我写了这段代码,将图像加载到ImageView小部件中: 现在,我要加载多个图像。为此,我需要动态创建图像视图,但是我不知道如何… 我想在for循环中运行我的代码: 我的主要问题是在循环内动态创建多个ImageView 问题答案: 您可以根据需要修改布局,图像资源和任何图像(也可以是动态的)…