Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.10.2020, 23:38
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Вопрос про async/await
Доброго времени суток, уважаемые знатоки.
Столкнулся с такой проблемой
Ниже простой код.
Первая функция num10 явно возвращает промис, т.к. там new Promise
Вторая функция num11 тоже возвращает промис, т.к. обёрнута в async.
https://learn.javascript.ru/async-await

Вопрос:
почему в третьей функции
* await num10() - работает КАК ПОЛОЖЕНО (браузер ждёт выполнения функции num10, консолит то, что она возвращает и идёт дальше)
* await num11() - НЕ РАБОТАЕТ (браузер не дожидается выполнения этой функции, её результат консолится в самом конце).

Почему так? Ведь обе функции num10 и num11 вроде как промисы.
Почему одно работает, другое нет.

Никак в толк взять не могу.
Буду очень благодарен за ваши ответы
Если вдруг где-то туплю и вопрос совсем глупый - не судите строго. Не ошибается тот, кто ничего не делает


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();
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2020, 08:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Потому, что num11 возвращает сразу разрешенный Promise
Реально она работает так

function num11 () {
    setTimeout(()=> {
        let num = 11 * 11;
        return console.log(num);
    }, 3000);

    return Promise.resolve(undefined);
}
Ответить с цитированием
  #3 (permalink)  
Старый 30.10.2020, 11:03
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от voraa Посмотреть сообщение
Потому, что num11 возвращает сразу разрешенный Promise
Реально она работает так

function num11 () {
    setTimeout(()=> {
        let num = 11 * 11;
        return console.log(num);
    }, 3000);

    return Promise.resolve(undefined);
}
Вы уверены, что причина именно в этом??
Ну возвращает промис в num11 undefined, и что? Вопрос не в том, что он возвращает, а в том, КОГДА он срабатывает.

А разве в функции num10 не указано, что промис будет разрешённый? Там же тоже стоит резолв.
Ответить с цитированием
  #4 (permalink)  
Старый 30.10.2020, 11:59
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

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
Ответить с цитированием
  #5 (permalink)  
Старый 30.10.2020, 12:08
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от SuperZen Посмотреть сообщение
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
Ответить с цитированием
  #6 (permalink)  
Старый 30.10.2020, 12:21
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

кому-то стоить сделать calmdown )) на заборе тоже х написано, а там дрова ))

ну так
function a() {}
console.log(a()) // undefined


num11 и возвращает undefined ) а то что там происходит в setTimeout так это про event loop надо читать...
Ответить с цитированием
  #7 (permalink)  
Старый 30.10.2020, 13:16
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от vlad_kl
Ну возвращает промис в num11 undefined, и что? Вопрос не в том, что он возвращает, а в том, КОГДА он срабатывает.

А разве в функции num10 не указано, что промис будет разрешённый? Там же тоже стоит резолв.
А вы разницу не видите?
num10 запускает таймер и возвращает промис, который разрешится после срабатывания таймера.
А num11 запускает таймер и возвращает уже разрешенный промис. А таймер сам по себе когда-нибудь сработает

Последний раз редактировалось voraa, 30.10.2020 в 13:22.
Ответить с цитированием
  #8 (permalink)  
Старый 30.10.2020, 13:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Сообщение от SuperZen
num11 и возвращает undefined
Нет. В исходном варианте (первый пост) num11 возвращает промис.
Ответить с цитированием
  #9 (permalink)  
Старый 30.10.2020, 14:58
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

voraa, Ты прав... Куда-то не туда смотрел )

async function a() { }
  console.log(a())
  /**
  Promise
    __proto__: Promise
      [[PromiseState]]: "fulfilled"
      [[PromiseResult]]: undefined
  */
Ответить с цитированием
  #10 (permalink)  
Старый 31.10.2020, 14:34
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от voraa Посмотреть сообщение
А вы разницу не видите?
num10 запускает таймер и возвращает промис, который разрешится после срабатывания таймера.
А num11 запускает таймер и возвращает уже разрешенный промис. А таймер сам по себе когда-нибудь сработает
Т.е., если я правильно понял, await ожидает завершения выполнения промиса (а не всего кода внутри промиса). Как только промис завершился удачно (даже если там ещё остался какой-то асинхронный код), интерпретатор идёт далее.

В 1м случае в num10 в конструкции new Promise - промис завершится ТОЛЬКО ТОГДА, когда завершится setTimeout, поэтому код ждёт весь setTimeout.
Во 2м случае в num11 async сразу возвращает зарезолвленный промис несмотря на весь код, который внутри async функции. Поэтому await дождался завершения выполнения промиса - и пошёл дальше. А сам setTimeout внутри async функции попал в call stack и выполнился позже. Намного позже, чем выполнение промиса.

Верно? Это очень тонкое отличие...
Спасибо большое всем за помощь
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
еще один вопрос про кнопки и события f0rzik Общие вопросы Javascript 15 19.01.2013 23:19
Вопрос про change vitaly63 Общие вопросы Javascript 1 24.12.2012 10:50
Глупый вопрос про if then. Irish.Tippler Общие вопросы Javascript 9 26.07.2012 12:32
вопрос про создание переменной Gamestop Общие вопросы Javascript 2 04.09.2011 21:48
Вопрос: И опять про offsetLeft... sigurd Общие вопросы Javascript 11 04.10.2010 14:06