@artimer

Почему недоступна переменная в методе post?

Суть вопроса подробнее отражена в комментариях в коде. Не понимаю почему в методе app.post поле winner объекта state неопределено/undefined(в методе makeMove(column) переменная объявляется и инициализируется успешно ), причем со всеми остальными полями (field, currentPlayer) проблем нет. Явно в областях видимости что-то упустил....
const express = require('express');
let cors = require("cors");
let bodyParser = require("body-parser");

const app = express();
app.use(cors());
app.use(bodyParser.json());

let state = {
    field: [
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0],
    ],

    currentPlayer: 1
}

function findWinner(field, column, row){
    const player = state.currentPlayer;
    for(let iColumn = 0; iColumn <= field[column].length ; iColumn++){
        if(field[iColumn][row] === player){
            let winCounter = 0;
            for(let step = iColumn; step <= field[column].length; step++){
                if(field[step][row] === player){
                    winCounter++;
                    if(winCounter === 4) {
                        console.log('player:' + player);
                        state.winner = player;
                        console.log('state.winner:' + JSON.stringify(state)); // тут state.winner !== undefined
                    }
                } else break;
            }
        }
    }
}

function makeMove(column) {
    const newField = [...state.field];
    const player = state.currentPlayer;
    const lastZeroInex = newField[column].lastIndexOf(0);
    if (lastZeroInex !== -1) {
        newField[column][lastZeroInex] = player;
    }

    findWinner(newField, column, lastZeroInex)
    console.log('state.winner:' + state.winner); // здесь state.winner !== undefined

    const newPlayer = player === 1 ? 2 : 1;

    state = {
        field: newField,
        currentPlayer: newPlayer
    };
}

app.post('/move', (req, res) => {
    console.log(req.body.column);
    makeMove(req.body.column); //а вот тут уже state.winner === undefined 
    res.send( state);
});

app.listen(5000);
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Ну так вы же полностью переписываете объект:

state = {
    field: newField,
    currentPlayer: newPlayer
};

Где тут свойство winnner? Не вижу. А-у-у-у, winner, ты где? Нет никого.

Может, вы хотели объект дополнить? Типа, Object.assign(state, { ... }).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы