Nikulio
@Nikulio
NaN !== NaN

Почему не могу использовать await в if блоке?

Всем привет
Есть такой AC :

export const renderNotes = (user , users) => async dispatch => {
  Object.keys(users).map(element => {
    if (user === users[element].login) {
      let elements = await fire.database().ref('users/' + element + '/notes/'); // Сейчас тут ошибка
      return dispatch({
        type: RENDER_NOTES,
        payload: elements
      })
    }
  })
};


Так - всё работает :

export const renderNotes = (user , users) => async dispatch => {
  let elements = await fire.database().ref('users/' + element + '/notes/'); // Вынес сюда присвоение
  
  Object.keys(users).map(element => {
    if (user === users[element].login) {
      return dispatch({
        type: RENDER_NOTES,
        payload: elements
      })
    }
  })
};


Почему не могу использовать await в If() ?
  • Вопрос задан
  • 183 просмотра
Решения вопроса 2
rockon404
@rockon404 Куратор тега React
Frontend Developer
Дело не в условном операторе, а в том, что у вас колбек у map не асинхронная функция и в ней нельзя использовать ключевое слово await. Исправить можно так:
export const renderNotes = (user , users) => dispatch => {
  Object.keys(users).forEach(async element => {
    if (user === users[element].login) {
      const elements = await fire.database().ref('users/' + element + '/notes/'); 

      return dispatch({
        type: RENDER_NOTES,
        payload: elements,
      });
    }
  })
};


В случае когда надо лишь пройтись по элементам массива, использовать метод map неправильно, для таких случаев есть метод forEach.

map следует использовать тогда, когда на основе исходного массива, надо получить новый массив элементов, преобразованных по определенному алгоритму:
const srcArray = [ 0.134555, 0.294587, 0.570858];

const mappedArray = srcArray.map(el => (el * 100).toFixed(1) + '%');

console.log(mappedArray);

// => ["13.5%", "29.5%", "57.1%"]
Ответ написан
Комментировать
@RidgeA
await можно только внутри async
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@koshiii
Для того , чтобы использовать await, должен присутствовать объект Promise в структуре как описано в документации:
https://developer.mozilla.org/en-US/docs/Web/JavaS...
Ответ написан
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
папробуйте так
export const renderNotes = async(user , users) => async dispatch => {
  let elements = await fire.database().ref('users/' + element + '/notes/'); // Вынес сюда присвоение
  
  Object.keys(users).map(element => {
    if (user === users[element].login) {
      return dispatch({
        type: RENDER_NOTES,
        payload: elements
      })
    }
  })
};
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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