Async / Await не работает в моем примере

Многие разработчики 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 в своей консоли. Какую часть я сделал не так или не знаю об этом?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
388
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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`);
})();

Другие вопросы по теме