isRunning
상태가 여전히 true이기 때문에 타이머가 자동으로 실행되는 문제였다. create_board: (state, action) => { const { rowNum, columnNum, mineNum } = action.payload; state.boardData = plantMine(rowNum, columnNum, mineNum); state.mine = mineNum; state.timer = 0; state.result = ''; state.isRunning = false; // 추가 state.openedCount = 0; }, start_game: (state) => { state.isRunning = true; },
create_board
에서 state.isRunning = false
를 추가해 보드 생성 시마다 isRunning 상태를 비활성화해서 해결Uncaught RangeError: Maximum call stack size exceeded
mindCount === 0
)인 셀을 열었을 경우 근처의 주변 지뢰 갯수 0인 셀들을 한 번에 여는 로직에서checkAround
가 실행된) 셀들까지 또다시 checkAround
가 실행되면서 콜스택 에러가 발생한다. checkAround
를 실행하도록 조건을 추가해서 해결추가한 조건
if(boardData[cellIdx[0]][cellIdx[1]] < CODE.OPENED)
- 오픈된 셀에 대한 값은 모두
CODE.OPENED
(= 0
)보다 크므로, 이보다 작은 값일 경우에만 실행되도록 조건을 작성한다.!==
로 조건 작성할 경우 이미 오픈된 셀에 대한 중복 실행이 일어난다.
near.filter((cellIdx) => ~~~) // 테이블에 해당하는 셀만 filter .forEach((cellIdx) => checkAround(cellIdx[0], cellIdx[1]); }); } };
- filter 된 near 배열 중 이미 오픈된 셀도 forEach에 의해 checkAround가 실행되는 상태
near.filter((cellIdx) => ~~~) // 테이블에 해당하는 셀만 filter .forEach((cellIdx) => { if (boardData[cellIdx[0]][cellIdx[1]] < CODE.OPENED) { // 이미 오픈된 셀 아닌 경우에만 실행 checkAround(cellIdx[0], cellIdx[1]); } }); } };
checkAround
를 실행하는게 일정 횟수를 넘어가면 콜 스택 에러가 발생한다.setTimeout()
같은 비동기 코드로 감싸주고 백그라운드와 태스크 큐에 할당해서 해결하는 것 같다