Как использовать хук реакции «useMemo» с асинхронными функциями?

Как я могу дождаться, чтобы разрешить/отклонить обещание, возвращаемое функцией, завернутой в хук реакции «useMemo»?

В настоящее время мой код выглядит так:

  // Get the persisted email/username
  const persistedUsername = useMemo(async () => {
    let username;

    try {
      username = await AsyncStorage.getData(`@${ASYNC_STORAGE_KEY}:username`);
    } catch {}

    return username;
  }, []);  

РЕДАКТИРОВАТЬ

Чего я пытаюсь добиться, так это получить данные до того, как компонент будет визуализирован, своего рода жизненный цикл «componentWillMount». У меня было два варианта:

  1. Вычисление значения с использованием хука useMemo, чтобы избежать ненужных перерасчетов.
  2. Комбинируйте useEffect + useState. Не лучшая идея, потому что useEffect запускается после отрисовки компонента.

@DennisVash предложил решение этой проблемы в комментариях:

Блокировка всех визуальных эффектов с помощью хука useLayoutEffect (какой-то компонентDidMount/componentDidUpdate), когда код запускается сразу после обновления DOM, но до того, как браузер успел «отрисовать» эти изменения.


Как видите, persistedUsername все еще обещание (я не жду результата асинхронной функции)...

Есть идеи? Не лучше ли выполнять асинхронные задания с помощью этого хука? Любой кастомный крючок?

Кроме того, каковы недостатки выполнения этой операции таким образом по сравнению с использованием useEffect и useState?

То же самое с useEffect и useState:

  useEffect(() => {
    // Get the persisted email/username
    (async () => {
      const persistedUsername = await AsyncStorage.getData(
        `@${ASYNC_STORAGE_KEY}:username`
      );

      emailOrUsernameInput.current.setText(persistedUsername);
    })();
  }, []);

Спасибо.

Итак, объявите обещание внутри useMemo и назовите его?...

Dennis Vash 13.12.2020 12:53

мне кажется, что вместо этого больше подходит для useEffect и useState

thedude 13.12.2020 12:56

@thedude Да, я тоже так думал, но, возможно, это можно сделать с помощью useMemo (я никогда не использовал его для асинхронных операций).

Victor Molina 13.12.2020 12:59

Вы знаете разницу между useEffect и useMemo? Они не служат той же цели, зачем вам делать асинхронное действие в useMemo? Вы в основном спрашиваете, в чем разница между ними?

Dennis Vash 13.12.2020 13:35

@DennisVash useEffect заключается в выполнении действий после рендеринга, последнего выполнения компонента, верно? И используйтеMemo для выполнения весовых действий, избегая их повторного вычисления при каждом рендере.

Victor Molina 13.12.2020 13:48

По сути, я подумал использовать его здесь, потому что, если бы процесс получения постоянного имени пользователя не был асинхронным, имело бы смысл выполнить это до рендеринга (какой-то жизненный цикл componentWillMount)

Victor Molina 13.12.2020 13:50

Итак, вы спрашиваете, как использовать componentWillMount с крючками? Попробуйте немного поискать, это почти идентично использованию useLayoutEffect

Dennis Vash 13.12.2020 13:56

Ваш вопрос звучит как проблема XY xyproblem.info, где вы спрашиваете о своей попытке решения с помощью useMemo и useEffect вместо того, чтобы спрашивать о реальной проблеме, которую вы пытаетесь решить.

Dennis Vash 13.12.2020 13:59

@DennisVash моя вина, извините, я постараюсь отредактировать вопрос, чтобы упростить понимание проблемы. Также большое спасибо за информацию, это решило мою проблему, я не знал о хуке useLayoutEffect.

Victor Molina 13.12.2020 14:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
7 693
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вопрос в том, как использовать componentWillMount с хуками, что почти эквивалентно useLayoutEffect (поскольку componentWillMount устарело).

Чтобы получить дополнительную информацию, вам НЕ следует разрешать действие async в useMemo, поскольку вы заблокируете поток (а JS является однопоточным).

Это означает, что вы будете ждать, пока обещание будет разрешено, а затем продолжится вычисление компонента.

С другой стороны, асинхронные хуки, такие как useEffect, являются лучшим вариантом, поскольку они не будут его блокировать.

Другие вопросы по теме