async/await как получить вернуть значение из функции
Доброго дня.
Может кто-нибудь внятно объяснить следующее В учебнике https://learn.javascript.ru/async-await Есть такой пример:
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("готово!"), 1000)
});
let result = await promise; // будет ждать, пока промис не выполнится (*)
alert(result); // "готово!"
}
f();
Все отлично, все работает. alert с текстом Готово выводится. Если вот этот место alert(result); // "готово!" } f(); переписать, как return result; } alert(f()); Получаем ObjectPromice. И ни один пример на странице внятно не объясняет как из функции вернуть "готово!". Вот и вопрос. как в alert(f()) "получить" - "готово!"? |
async функция всегда возвращает промис, разрешенный с тем значением, которое было указано в return.
return value в async функции эквивалентно return Promise.resolve(value), если value не является Promise. А если value - Promise, то оно и возвращается. Что бы достать значение из возвращенного Promise - используется оператор await async function f () {return 42} let a = f() // a = Promise.resolve(42) let b = await f() // b = 42 Поэтому переписываем alert (await f()) |
Цитата:
|
Есть тут особенность. Оператор await можно использовать только внутри асинхронных функций.
Поэтому надо обернуть код в асинхронную функцию, а потом вызывать ее
async function main () {
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("готово!"), 1000)
});
return promise; // будет ждать, пока промис не выполнится (*)
}
alert( await f());
}
main()
Другой вариант - просто использовать then
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("готово!"), 1000)
});
return promise; // будет ждать, пока промис не выполнится (*)
}
f().then (res => alert(res))
|
Цитата:
По большому-то счету нет задачи вывести алертом "готово", задача var i = f(), с тем, чтобы в i оказалось готово. |
Цитата:
var i = await f(); Иначе var i; f().then(res => i = res); В Javascript нет способа заставить код просто ждать, когда что то произойдет. Есть только возможность, сказать; "Когда произойдет, сделай то то." Но код при этом будет выполняться дальше |
Цитата:
|
Цитата:
Допустим есть
async function f () {....return val}
async function g() {
var i = await f()
// какие то другие операторы
var j = 3*i // j зависит от i
// еще операторы
}
Тогда это будет эквивалентно (Интерпретатор буквально преобразует код)
async function g() {
var i;
f().then ( res => {
i = res;
// какие то другие операторы
var j = 3*i // j зависит от i
// еще операторы
})
}
|
| Часовой пояс GMT +3, время: 17:50. |