Написание асинхронной / ожидающей версии обещания - PullRequest
0 голосов
/ 15 января 2019

Приведенный ниже код регистрирует «привет мир» один раз в секунду, как и ожидалось.

function moveOneStep() {
  return new Promise((res, rej) => {
    setTimeout(() => {
      res(console.log('Hello world!'))
    }, 1000)
  })  
}

async function main() {
  await moveOneStep();
  await moveOneStep();
  await moveOneStep();
  await moveOneStep();
}

Учитывая, что значение return функции async соответствует тому, что возвращается из функции resolve в обещаниях, почему код ниже не выдает тот же результат, а вместо этого регистрирует всеПривет, мир сразу:

async function moveOneStepAsync() {
  setTimeout(() => {
    return console.log('Hello world!');
  }, 1000);
}

async function main() {
  await moveOneStepAsync();
  await moveOneStepAsync();
  await moveOneStepAsync();
  await moveOneStepAsync();
}

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы ничего не делаете для return функции, вы возвращаетесь к внутренней функции setTimeout, и это ничего не делает с этим значением.Вызов setTimeout не возвращает обещание, он скорее возвращает таймер немедленно.И поэтому все вызовы moveOneStepAsync выполняются немедленно, таймеры устанавливаются и срабатывают через одну секунду.

0 голосов
/ 15 января 2019

Это потому, что setTimeout не возвращает обещание await в вашей функции main. Сам setTimeout выполняется синхронно. Он добавляет к циклу событий обратный вызов, который передается в качестве аргумента для выполнения в указанное время.

Также в этом коде возврат вашего обратного вызова ничего не значит, так как обратный вызов будет запущен через 1 секунду, а возвращаемое значение никуда не денется.

Ключевое слово

async говорит о том, что функции возвращают обещание и могут содержать await код. Так как в вашем коде нет ожидания, он выглядит как

function moveOneStepAsync() {
  setTimeout(() => {
    return console.log('Hello world!');
  }, 1000);
  return Promise.resolve();
}

Таким образом, ваш await в основном будет ожидать один тик цикла событий, чтобы перейти к следующему «шагу»

Читайте о setTimeout, цикле событий и о том, что ожидает, чтобы понять его более подробно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...