Поскольку я хочу проверить, нужен ли вводимый ими маршрут канала PIN-код, я использую router.beforeEach, как показано ниже:

router.beforeEach((to, from, next) => {  
  if(to.path == '/') {
    next();
  }else {                
    store.dispatch('checkChannelhasPin', to.params.id).then(()=>{
    console.log(store.getters);
    console.log(store.getters.ispin);
    setTimeout(() => {
      console.log(store.getters.ispin);
     }, 500);
   }) 
  }
}

Как console.log у меня три результата:

enter image description here

Проблема в том, что я не могу получить stateispin после проверки checkChannelhasPin.

Действие:

import axios from 'axios';
import setChannelAuthToken from '../../utils/setChannelAuthToken';
import {
  CHECK_CHANNEL_HASPIN
} from '../typeName';

const state = {
  ispin: true,      
}

const getters = {  
  ispin: (state) => state.ispin
};

const actions = {      
  async checkChannelhasPin({commit}, params) {    
    axios.post(
      window.home+'/json/channel/checkAuth',
      {
        channel_id:params
      }
    ).then((response) => {      
      let payload = response.data.ispin;
      commit(CHECK_CHANNEL_HASPIN, payload); 
    }).catch( (error) => {
      console.log(error);
    });
  }
}


const mutations = {
  CHECK_CHANNEL_HASPIN: (state, payload) => (state.ispin = payload)
};

export default {
  state,
  getters,
  actions,
  mutations
};

Вы можете мне предложить? Большое спасибо.

1
Hai Tien 23 Янв 2021 в 05:35

2 ответа

Лучший ответ

Вам нужно вернуть обещание из действия:

checkChannelhasPin({commit}, params) {    
  return axios.post(
    window.home+'/json/channel/checkAuth',
    {
      channel_id:params
    }
  ).then((response) => {      
    let payload = response.data.ispin;
    commit(CHECK_CHANNEL_HASPIN, payload); 
  }).catch( (error) => {
    console.log(error);
  });
}

Или, если вы использовали синтаксис async/await, вы могли бы сделать это:

async checkChannelhasPin({commit}, params) {
  try {
    const response = await axios.post(
      window.home+'/json/channel/checkAuth',
      {
        channel_id:params
      }
    )
    let payload = response.data.ispin;
    commit(CHECK_CHANNEL_HASPIN, payload); 
  } catch(error) {
    console.log(error);
  }
}

Когда вы используете .then, вы должны явно вернуть обещание. Когда вы используете async/await, вы этого не делаете. Вы использовали ключевое слово async, но использовали .then вместо await.

1
Dan 23 Янв 2021 в 03:45

"router.app. $ options.store" , Вам нужно получить вот так

-1
City 23 Янв 2021 в 02:44