Я работал с асинхронными/ожидающими функциями уже несколько месяцев, и я получил весь свой код на работу, однако, я не понимаю его полностью и могу использовать некоторые мудрые слова.
В моем коде ниже у меня есть асинхронная функция, мой вопрос... почему она возвращает обещание вместо ожидаемого значения? И что еще более важно, как правильно получить желаемое значение?
getName = async () => {
const request = await fetch(apiUrl)
const data = await request.json()
return data.response.name
}
Я вызываю функцию позже
const name = getName()
Но name
это обещание, а не имя.
Я смотрел это много раз, и он никогда не застревает. Я надеюсь использовать свой собственный пример, если кто-то сможет мне это объяснить, поэтому я полностью понимаю, что он, наконец, останется со мной.
РЕДАКТИРОВАТЬ - В ответ на @Paulpro я обновил свой вопрос ниже...
При условии, что с асинхронной функцией все в порядке, вопрос в том, как мне сохранить значение.
const name = getName()
"имя" теперь обещание, поэтому я обычно делаю что-то вроде этого...
getName().then(name => setName(name))
но как мне сделать const name === возвращаемое имя?
как сделать const name === возвращаемое имя?
Используя const name = await getName()
.
Это означает, что вы должны использовать его внутри async
функции.
Итак, ваш подход использует:
getName().then(name => setName(name))
Скорее всего, это лучший способ сделать это, но это действительно зависит от остальной части вашего кода.
Я имею в виду, что вы могли бы сделать это так:
let name;
getName = async () => {
const request = await fetch(apiUrl)
const data = await request.json()
name = data.response.name;
}
Когда (и если) оба ваших асинхронных запроса завершатся, у вашей переменной name
будет результат. Но нет никаких гарантий относительно сроков этого. В зависимости от приложения может быть хорошо, если вы инициализируете свою переменную следующим образом:
let name = 'Loading...';
getName().then(name => setName(name))
подходит, потому что помещение его в асинхронную функцию создаст побочный эффект. Таким образом, getName
остается чистой функцией, которую можно использовать в других местах, и ответ может быть обработан вне функции. (Жаль, что я не был уверен в справедливости того, что я только что сказал - смеется)
getName()
не может быть чистой функцией, потому что она выполняет вызов API, который она не контролирует. Однако, по крайней мере, он не будет изменять какие-либо внешние переменные, к чему я стремился. Я помещаю все в try / catch, чтобы он либо возвращал значение name, либо сообщение об ошибке.
name = await getName()
или использовать присвоение в другой асинхронной функции иawait
его, например,name = await getName()