Многие разработчики JavaScript знают о async/await и их преимуществах, поэтому я пытаюсь протестировать старый пример асинхронного действия, давайте посмотрим на мой эксперимент:
Несомненно, ответ приведенного ниже кода:
/*Line: 1*/ console.info(`1`);
/*Line: 2*/ console.info(`2`);
/*Line: 3*/ console.info(`3`);
//==> 123
Итак, я хочу поставить setTimeout для второй строки:
/*Line: 1*/ console.info(`1`);
/*Line: 2*/ setTimeout(() => {
console.info(`2`);
}, 0);
/*Line: 3*/ console.info(`3`);
//==> 132
Из-за асинхронного действия второй строки 2 находится после 13, поэтому в консоли отображается 132.
Я решил использовать функцию async/await нового JavaScript, чтобы снова увидеть 123, поэтому я написал приведенный выше код следующим образом:
(async () => {
console.info(`1`);
await setTimeout(() => {
console.info(`2`);
}, 0);
console.info(`3`);
})();
Но это не работает, и я снова увидел 132 в своей консоли. Какую часть я сделал не так или не знаю об этом?



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


setTimeout не возвращает обещание. Чтобы заставить его работать, вам нужно будет создать функцию, возвращающую обещание, которое разрешается внутри обратного вызова setTimeout.
(async () => {
console.info(`1`);
await new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
console.info(`2`);
},0);
});
console.info(`3`);
})();Вам нужно создать функцию, например async function foo() {}, и делать внутри нее вызовы await.
await ожидает выполнения обещания. Поскольку setTimeout не является обещанием, выполнение программы не будет ждать, пока она будет выполнена. Вам нужно будет заключить setTimeout() в обещание, как указано в первом примере следующей ссылки, чтобы ваш пример работал должным образом:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Вы можете ожидать только функцию, которая возвращает обещание. Обратите внимание, что await можно использовать только внутри асинхронной функции:
async function someFunc() {
console.info(`1`);
await new Promise((resolve, reject) => setTimeout(() => {
console.info(`2`);
resolve();
}, 0));
console.info(`3`);
}
someFunc();Await следует вызывать для функции, которая возвращает обещание (в противном случае оно просто возвращается).
setTimeout не возвращает обещание, поэтому вы должны заключить его в функцию, возвращающую обещание.
Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
Этот код должен работать.
(async() => {
console.info(`1`);
await (() => {
return new Promise( resolve => {
setTimeout(() => {
console.info(2);
resolve()
}, 1000);
});
})();
console.info(`3`);
})();