Различное поведение при перехвате сгенерированной ошибки в переключателе по умолчанию или в случае (React / Redux) - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот редуктор и эти два промежуточного программного обеспечения

...

const reducer  = (
    state = {
        username : '',
        token : '?'
    }, 
    action
) => {
    switch (action.type){
        case 'SET_TOKEN': 
            state = { ...state, token : action.payload }
            break
        case 'SET_USERNAME': 
            state = { ...state, username : action.payload }
            break
        case 'SET_USERNME': 
            throw new Error("Errore, nessuna azione corrispondente")
            break               
    }
    return state
}

const logger = (store) => (next) =>(action) => {

  console.log(store, next, action);
  next(action);

}

const error = (store) => (next) =>(action) => {
  try{
    console.log("Checking errors");
    next(action);
  }catch(e){
    console.log("Error is: " +e);
  }
}

const middleware = applyMiddleware(logger, error);

...

Теперь, когда я отправляю ему действие 'SET_USERNME', я получаю сообщение об ошибке на своей консоли, которое говорит: есть ошибка, но приложениепродолжать работать.Но я не могу понять почему.если я поменяю часть коммутатора таким образом, я больше не получаю консольного сообщения, кроме ошибки.

    switch (action.type){
        case 'SET_TOKEN': 
            state = { ...state, token : action.payload }
            break
        case 'SET_USERNAME': 
            state = { ...state, username : action.payload }
            break
        default: 
            throw new Error("Errore, nessuna azione corrispondente")
            break               
    }

1 Ответ

0 голосов
/ 16 мая 2018

Проблема в следующем. Более поздняя реализация выдаст ошибку для любого действия типа, который он не знает.

При создании магазина редукс отправляет действие @@redux/INIT<SomeRandomString> для получения исходного состояния. Но ваш редуктор выбросит весь процесс начальной загрузки. Так что ваше приложение вообще не запустится.

switch (action.type){
    case 'SET_TOKEN': 
        state = { ...state, token : action.payload }
        break
    case 'SET_USERNAME': 
        state = { ...state, username : action.payload }
        break
    default: // this will throw for redux init action as well.
        throw new Error("Errore, nessuna azione corrispondente")
        break               
}

Проверить это комментарий

/**
 * These are private action types reserved by Redux.
 * For any unknown actions, you must return the current state.
 * If the current state is undefined, you must return the initial state.
 * Do not reference these action types directly in your code.
 */

Esp обратите внимание на Для любых неизвестных действий вы должны вернуть текущее состояние. и Если текущее состояние не определено, вы должны вернуть исходное состояние.

...