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() ?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
rockon404
@rockon404
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%"]
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@koshiii
Для того , чтобы использовать await, должен присутствовать объект Promise в структуре как описано в документации:
https://developer.mozilla.org/en-US/docs/Web/JavaS...
Ответ написан
папробуйте так
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
      })
    }
  })
};
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
22 июля 2018, в 20:41
10000 руб./за проект
22 июля 2018, в 20:13
2000 руб./за проект