#javascript #arrays #object #foreach #mapping
Вопрос:
У меня есть эта функция, которая возвращает результат из GET в API (я использую API AWS Rest для контекстуализации).:
const listUsers = async () => {
const apiName = 'AdminQueries'
const path = '/listUsers'
const params = {
headers: {
'Content-Type': 'application/json',
Authorization: `${(await Auth.currentSession())
.getAccessToken()
.getJwtToken()}`,
},
}
return await API.get(apiName, path, params)
}
И если я вызову функцию для печати на консоли, например:
console.log(listUsers())
Я получаю массив на своей консоли:
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Object
Users: Array(42)
0: {Username: "00e534e3-08ee-4bc1-9d19-ab18208e3f94", Attributes: Array(5), UserCreateDate: "2021-09-06T10:05:35.537Z", UserLastModifiedDate: "2021-09-06T10:05:35.537Z", Enabled: true, …}
1: {Username: "05f4ce2e-4b57-48d5-9f5f-e18d250aefb4", Attributes: Array(6), UserCreateDate: "2021-09-10T19:45:32.002Z", UserLastModifiedDate: "2021-09-10T19:54:37.333Z", Enabled: true, …}
2: {Username: "06a78cc7-af6a-4fb6-975d-458c089b69a5", Attributes: Array(6), UserCreateDate: "2021-09-10T18:04:27.780Z", UserLastModifiedDate: "2021-09-10T18:04:27.780Z", Enabled: true, …}
3: {Username: "32652d77-e7a4-444a-9995-f8f50eb14633", Attributes: Array(6), UserCreateDate: "2021-09-06T15:48:24.897Z", UserLastModifiedDate: "2021-09-06T15:49:39.476Z", Enabled: true, …}
length: 42
__proto__: Array(0)
__proto__: Object
Как отобразить этих пользователей в массиве? Я пытался, но не смог.
Комментарии:
1. Это асинхронная функция, использующая
console.log(await listUsers())
2. Удалите
async
иawait
в вашейlistUsers
функции; вам это там не нужно. Теперь запуститеconst users = await listUsers();
иconsole.log(users)
из какой-нибудь асинхронной функции. (чтобы было ясно: нет возможности вернуться к коду синхронизации; как только вы используете асинхронный код, вы остаетесь асинхронным при выполнении вызовов функций) также смотрите здесь: jsfiddle.net/khrismuc/kpj204wL3. @ChrisG если я удалю асинхронное ожидание в теле функции, оно нарушит его, потому
.getAccessToken()
что это зависит от него. Также я не понимаю, как это решает мою проблему. Я все еще не могу нанести его на карту…4. @AnkushVerma если я это сделаю, я получу
Module parse failed: The top-level-await experiment is not enabled (set experiments.topLevelAwait: true to enabled it)
5. Верно, я пропустил 2-е ожидание. В любом случае, если вы вызовете
listUsers()
в контексте синхронизации, вы всегда получите обещание, а не массив пользователей. Вам нужноawait listUsers()
, чтобы получить массив. Вы можете использоватьawait
его на верхнем уровне, но вам нужно включить его или обновить узел. Ты смотрел на мою скрипку…? Это должно все прояснить.
Ответ №1:
Ваша функция ListUsers возвращает обещание. Чтобы получить ответ, вы можете использовать что-то вроде этого
const listUsers = async () => {
const apiName = 'AdminQueries'
const path = '/listUsers'
const params = {
headers: {
'Content-Type': 'application/json',
Authorization: `${(await Auth.currentSession())
.getAccessToken()
.getJwtToken()}`,
},
}
return await API.get(apiName, path, params)
}
**** update ****
const func = async () => {
const response = await listUsers();
console.log(response);
}
func();
Комментарии:
1. Да! Таким образом, я получаю массив на консоли. Но я не могу сделать func().map или func.map. Так как же мне его нанести на карту?
2. В этом случае вы можете просто вернуть свой массив вместо возврата обещания из
listUsers
функции.3. но какой массив, чувак? я не понимаю… если я вызову функцию func(), на консоли появится следующее сообщение: i.imgur.com/TB9O6tK.png Если я не вызову функцию func(), она не появится. Но как я могу показать ЭТОТ массив в своем компоненте react? Я не понимаю, понимаешь?
4. поскольку вы хотели использовать карту, я предположил, что api отвечает массивом. если это правильно, вы можете установить состояние внутри ListUsers(),
Ответ №2:
const listUsers = async () => {
const apiName = 'AdminQueries'
const path = '/listUsers'
const params = {
headers: {
'Content-Type': 'application/json',
Authorization: `${(await Auth.currentSession())
.getAccessToken()
.getJwtToken()}`,
},
}
return await API.get(apiName, path, params)
}
const func = async () => {
const response = await listUsers();
reponse.data?.map((item) => {
console.log(item);
})
}
Комментарии:
1.
TypeError: response.map is not a function