Возвращает значение из асинхронной функции. AWS /React

#javascript #reactjs #amazon-web-services #amplify

#javascript #reactjs #amazon-веб-сервисы #усилить

Вопрос:

Я пытаюсь создать компонент, который извлекает полный список пользователей из Amazon AWS / Amplify и отображает указанные результаты в таблице с помощью функции map. Пока все хорошо.

Однако для 4-го столбца мне нужно вызвать вторую функцию, чтобы проверить, является ли пользователь частью каких-либо групп. Я протестировал функцию как событие кнопки / onClick — и она работает (консоль.протоколирование выходных данных). Но вызов его напрямую при рендеринге данных таблицы ничего не возвращает.

Вот что я включил в свой оператор return (в функции map)

<td>={getUserGroups(user.email)}</td>

Который затем вызывает эту функцию:

 const getUserGroups = async (user) => {
    const userGroup = await cognitoIdentityServiceProvider.adminListGroupsForUser(
      {
        UserPoolId: '**Removed**',
        Username: user,
      },
      (err, data) => {
        if (!data.Groups.length) {
          return 'No';
        } else {
          return 'Yes';
        }
      }
    );
  };
 

Кто-нибудь может посоветовать? Заранее большое спасибо, если это так!

Ответ №1:

Потому что вы никогда не должны этого делать! Ознакомьтесь с этим документом React, чтобы лучше понять, как и где вы должны выполнять вызовы AJAX.

Существует несколько способов, как вы можете решить свою проблему. Например, добавьте группы пользователей (или все, что вам нужно получить от серверной части) в качестве состояния, а затем вызовите серверную часть и затем обновите это состояние с помощью ответа, а затем React соответствующим образом перерисовает ваш компонент.

Пример с крючками, но это просто для объяснения идеи:

 const [groups, setGroups] = useState(null); // here you will keep what "await cognitoIdentityServiceProvider.adminListGroupsForUser()" returns

useEffect(() => {}, [
    // here you will call the backend and when you have the response
    // you set it as a state for this component
    setGroups(/* data from response */);
]);
 

И ваш компонент (столбец, что угодно) должен использовать groups :

 <td>{/* here you will do whatever you need to do with groups */}</td>
 

Для компонентов класса вы будете использовать методы жизненного цикла для достижения этой цели (все это в документации — ссылка выше).