Я вызываю эту функцию для получения атрибута пользователя, однако, когда я тестирую функцию, возвращаемый результат всегда «тест», а затем он проходит через «cognitoUser.getUserAttributes» и регистрирует фактический результат. Я не уверен, почему, но «cognitoUser.getUserAttributes», кажется, изначально пропущен.
при запуске выводит тест и вместо фактического результата
есть идеи?
function retrieveattribute(e) {
var ans = "test";
var e = "custom:InstanceID_1";
cognitoUser.getUserAttributes(function(err, result) {
if (err) {
alert(err);
return;
}
for (i = 0; i < result.length; i++) {
if (result[i].getName() == e) {
ans = result[i].getValue();
console.info(ans);
return ans;
}
}
});
return ans;
}
Оператор return внутри функции обратного вызова возвращает значение только из функции обратного вызова. Вместо использования обратного вызова вы должны написать ans = await cognitoUser.getUserAttributes()
Привет, Мэтью, не могли бы вы немного расширить это, пожалуйста?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для запуска «асинхронного кода» вам нужно обернуть вашу функцию обещанием:
function retrieveattribute(e) {
return new Promise(function(res) {
var ans = "test";
var e = "custom:InstanceID_1";
cognitoUser.getUserAttributes(function(err, result) {
if (err) {
alert(err);
return;
}
for (i = 0; i < result.length; i++) {
if (result[i].getName() == e) {
ans = result[i].getValue();
console.info(ans);
res(ans);
}
}
});
})
}
После этого вы можете использовать как обещание:
retrieveattribute(e).then(t => console.info(t))
Или дождитесь его в асинхронной функции:
await retrieveattribute(e)
Возможный дубликат Как вернуть ответ на асинхронный вызов?