setTimeout работает с асинхронными ключевыми словами, но не знаю, как это работает - PullRequest
0 голосов
/ 18 октября 2018

Я программирую на javascript и наткнулся на этот код. Интересно, как и почему работает приведенный ниже код:

var test = async () => {
  console.log("before");
  await setTimeout(() => {
    console.log("after");
  }, 1000);

};
test();

Это лог это:

  1. "до"
  2. "после"

Это пример кода, но мой вопрос, как это работает?setTimeout () не возвращает Promise (я думаю), поэтому пара async / await не должна работать или я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Ну, это не работает:

async function test() {
  console.log("before");
  await setTimeout(() => {
    console.log("callback");
  }, 1000);
  console.log("after");
}
test();

Вы получите before - after - callback.await ничего не останавливает, потому что - как вы узнали - setTimeout не возвращает обещание.Он ожидает undefined и продолжает выполнение следующего оператора.Вашему примеру просто не хватало этого следующего утверждения, поэтому вы не могли увидеть разницу.Вот рабочий пример:

function delay(t) {
    return new Promise(resolve => setTimeout(resolve, t));
}
async function test() {
  console.log("before");
  await delay(1000);
  console.log("after");
}
test();
0 голосов
/ 18 октября 2018

Согласно MDN Web Docs

Если значение выражения , следующего за оператором ожидания, не является Обещанием, оно преобразуется в разрешенное Обещание.

Итак, выражение await setTimeout преобразуется в разрешенное Обещание.

...