Redux thunk asyn c action не может получить доступ к первому параметру - PullRequest
0 голосов
/ 29 марта 2020

У меня есть действие, которое в настоящее время работает нормально, используя .then, но когда я пытаюсь преобразовать его в async ... await, оно внезапно не может получить доступ к первому параметру функции. Второй параметр по-прежнему работает нормально, хотя.

Текущая функция, которая отлично работает:

export const signInUser = (email, password) => {
  return (dispatch) => {
    return firebase
      .auth()
      .signInWithEmailAndPassword(email, password)
      .then(() => {
        console.log('signed in')
        const { uid, email } = firebase.auth().currentUser
        dispatch({ type: 'SIGN_IN', uid, email })
        return dispatch(fetchAllData())
      })
      .catch(error => {
        throw (error)
      })
  }
};

Новая функция, которая не работает, потому что 'email' не определена.

export const signInUser = (email, password) => {
  return async (dispatch) => {
    console.log('testing')
    console.log(password)
    console.log('testing', email, password)
    await firebase.auth().signInWithEmailAndPassword(email, password)
    console.log('signed in')
    const { uid, email } = firebase.auth().currentUser
    dispatch({ type: 'SIGN_IN', uid, email })
    return dispatch(fetchAllData())
  }
};

Первый консольный журнал console.log('testing') отлично работает и выводит строку 'testing'. Второй консольный журнал console.log(password) также работает нормально и печатает введенный пароль. Но третий консольный журнал console.log('testing', email, password) вообще не отображается.

Так называется функция:

Родительский компонент передает его дочернему компоненту: submit={(email, password) => dispatch(signInUser(email, password))}

Дочерний компонент вызывает его:

  const submitForm = (event) => {
    event.preventDefault();
    if (validForm) {
      setLoading(true)
      submit(email, password)
        .catch(err => {
          setLoading(false)
          console.log('catch:', err.code)
          setError(err.code)
        })
    }
  }

Вывод, который я получаю: catch: undefined.

Кроме того, если я изменю функцию на эту:

export const signInUser = (email, password) => {
  const userEmail = email
  return async (dispatch) => {
    console.log('testing')
    console.log(password)
    console.log('testing', userEmail, password)
    await firebase.auth().signInWithEmailAndPassword(userEmail, password)
    console.log('signed in')
    const { uid, email } = firebase.auth().currentUser
    dispatch({ type: 'SIGN_IN', uid, email })
    return dispatch(fetchAllData())
  }
};

Тогда все работает нормально. Но я не знаю, почему мне нужно изменить это так?

Спасибо

1 Ответ

0 голосов
/ 30 марта 2020

Ладно, причина, по которой это не сработало, заключалась в том, что на следующей строке я объявлял электронную почту, например, const { uid, email } = firebase.auth().currentUser , которая переопределяла параметр функции email и, следовательно, выдавала ошибку, которую я использовал email прежде чем это было объявлено.

...