ReactRedux, консольный журнал не работает при обратном вызове, который я передаю в функции setInterval

#javascript #reactjs #redux #react-redux

#javascript #reactjs #redux #реагировать-redux

Вопрос:

Я устанавливаю интервал, который запускает tick() функцию каждую секунду, внутри него addTwo изменяется действие count , числовая переменная в моем состоянии. Кажется, это работает, но когда я помещаю a console.log для печати count в ту же функцию, которую я вызываю addTwo , значение не обновляется, узел, содержащий значение, изменяется, но начальное значение (0) печатается в консоли, и оно не меняется.

 const {createStore} = Redux;
const {Provider, connect} = ReactRedux;

const reducer = (state = {count: 0}, action) =>{
    if (action.type == 'ADD-TWO'){
    return{
        count: state.count   2,
    }
  }else{
    return state;
  }
}

const addTwo = () =>({
    type: 'ADD-TWO',
})

const store = createStore(reducer);

const App = ({count, addTwo}) =>{
  
  const tick = () =>{
    addTwo();
    console.log(count);
  }
  
  const start = () => {
    window.timerID = setInterval(tick, 1000);
  }
  
    return(
    <>
      <p>{count}</p>
      <button onClick={start}>Press me!</button>
    </>
  )
}

const mapStateToProps = state => state;

const mapDispatchToProps = {
    addTwo,
}

const AppContainer = connect(
    mapStateToProps,
  mapDispatchToProps,
)(App);
 
ReactDOM.render(
    <Provider store={store}>
    <AppContainer />
  </Provider>
, document.getElementById('root'));

  

Нажмите здесь, чтобы увидеть код в codepen

Комментарии:

1. Это то, что называется «устаревшим закрытием». setInterval Получает версию tick , которая всегда имеет начальное значение.

2. О, спасибо! Могу ли я исправить это, передавая счетчик в качестве аргумента?

3. Похоже, вы это исправили? Журнал задерживается на один тик, но я думаю, что это просто из-за природы addTwo асинхронности.

4. Теперь он меняется, но запускается только при нажатии кнопки, setInterval, похоже, не работает.