如何在动作创建器中阻止while循环中的无限循环?

时间:2018-03-29 21:51:31

标签: javascript reactjs while-loop

尝试实施某种游戏循环,直到满足条件为止。

然而,在测试期间,我无法解决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'
                    })
                }

            })
       }
    }
}

当我发出动作时,“noOfEnemiesAttacked”增加,当它达到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 个答案:

答案 0 :(得分:1)

将它包装在一个函数中,现在应该可以正常工作

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