Вопрос про async/await
Доброго времени суток, уважаемые знатоки.
Столкнулся с такой проблемой Ниже простой код. Первая функция num10 явно возвращает промис, т.к. там new Promise Вторая функция num11 тоже возвращает промис, т.к. обёрнута в async. https://learn.javascript.ru/async-await Вопрос: :help: :help: :help: почему в третьей функции * await num10() - работает КАК ПОЛОЖЕНО (браузер ждёт выполнения функции num10, консолит то, что она возвращает и идёт дальше) * await num11() - НЕ РАБОТАЕТ (браузер не дожидается выполнения этой функции, её результат консолится в самом конце). Почему так? Ведь обе функции num10 и num11 вроде как промисы. Почему одно работает, другое нет. Никак в толк взять не могу. Буду очень благодарен за ваши ответы Если вдруг где-то туплю и вопрос совсем глупый - не судите строго. Не ошибается тот, кто ничего не делает :victory:
function num10 () {
return new Promise((resolve, reject)=> {
setTimeout(()=>{
resolve(10*10)
}, 3000);
}).then(
value => console.log(value),
);
}
async function num11 () {
setTimeout(()=> {
let num = 11 * 11;
return console.log(num);
}, 3000);
}
async function waitCount() {
console.log('1');
console.log('2');
await num10();
console.log('3');
await num11();
console.log('4');
}
waitCount();
|
Потому, что num11 возвращает сразу разрешенный Promise
Реально она работает так
function num11 () {
setTimeout(()=> {
let num = 11 * 11;
return console.log(num);
}, 3000);
return Promise.resolve(undefined);
}
|
Цитата:
Ну возвращает промис в num11 undefined, и что? Вопрос не в том, что он возвращает, а в том, КОГДА он срабатывает. А разве в функции num10 не указано, что промис будет разрешённый? Там же тоже стоит резолв. |
async/await для Promise, setTimeout != promise )
num10 возвращает promise, num11 не возвращает промис https://tc39.es/ecma262/#await https://jakearchibald.com/2015/tasks...and-schedules/ https://www.digitalocean.com/communi...-in-javascript |
Цитата:
А если верить учебнику, то async ВСЕГДА возвращает промис. И не важно, что внутри функции написан setTimeout, это просто для имитации задержки. Даже если внутри async function будет написано просто return 1 и всё - всё равно это будет ПРОМИС с результатом 1. Пожалуйста, вот линк https://learn.javascript.ru/async-aw...onnye-funktsii |
кому-то стоить сделать calmdown )) на заборе тоже х написано, а там дрова ))
ну так
function a() {}
console.log(a()) // undefined
num11 и возвращает undefined ) а то что там происходит в setTimeout так это про event loop надо читать... |
Цитата:
num10 запускает таймер и возвращает промис, который разрешится после срабатывания таймера. А num11 запускает таймер и возвращает уже разрешенный промис. А таймер сам по себе когда-нибудь сработает |
Цитата:
|
voraa, Ты прав... Куда-то не туда смотрел )
async function a() { }
console.log(a())
/**
Promise
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
*/
|
Цитата:
В 1м случае в num10 в конструкции new Promise - промис завершится ТОЛЬКО ТОГДА, когда завершится setTimeout, поэтому код ждёт весь setTimeout. Во 2м случае в num11 async сразу возвращает зарезолвленный промис несмотря на весь код, который внутри async функции. Поэтому await дождался завершения выполнения промиса - и пошёл дальше. А сам setTimeout внутри async функции попал в call stack и выполнился позже. Намного позже, чем выполнение промиса. Верно? Это очень тонкое отличие... :write: :write: Спасибо большое всем за помощь :victory: :victory: |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 23:27. |