Понимание NodeJs ожидание с помощью метода setTimeout () - PullRequest
0 голосов
/ 17 апреля 2020

Я довольно новичок в NodeJs и понимаю концепцию async / await. Пожалуйста, исправьте меня, если я ошибаюсь - ключевое слово await блокирует код, пока оно не получит разрешенное значение . Например:

const sampleFunction = async () => {
      const result = await someAsynFunctionReturningPromise();
      console.log('Log is printed here!');
}  

В приведенном выше коде компилятор останавливает код на «const result = await someAsynFunctionReturningPromise ();» до тех пор, пока 'someAsynFunctionReturningPromise ()' не будет решена, верно?

Исходя из вышеизложенного предположения, я попробовал приведенный ниже код setTimeout ():

const sampleFunction = async () => {
  const result = await setTimeout(()=>{
        console.log('This is printed after 2 seconds');
  },2000);
  console.log('Log is printed here!');
}    

Однако приведенный выше код не ждет до разрешения setTimeout (), он переходит к следующей строке, печать «Журнал печатается здесь!».

Может кто-нибудь помочь мне понять, если мое понимание неверно?

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Вы написали свой собственный ответ. Вы написали

ключевое слово await блокирует код до тех пор, пока оно не получит разрешенное значение

В вашем коде вы никогда ничего не разрешали, поэтому, конечно, он не будет работать

Разрешающее значение setTimeout -

function wait(ms = 0) {
  return new Promise(function(resolve, reject) { 
    setTimeout(resolve, ms);
  };
}

или краткая версия

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

Пример

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

const sampleFunction = async () => {
  for(;;) {
    await wait(2000);
    console.log('time since page loaded:', performance.now() / 1000 | 0);
  }
};

sampleFunction();
1 голос
/ 17 апреля 2020

Здесь происходит событие l oop из node JS. Во-первых, ваш

someAsynFunctionReturningPromise()

возвращает обещание, когда во втором коде setTimeout () не возвращает вас обещание. Также, когда nodejs eventl oop получает такую ​​функцию, как setTimeout (), он помещает ее в callstack, а затем в очередь задач, где он будет ждать 2000 мс и перейдет к следующей строке выполнения, поэтому печатает

console.log('Log is printed here!');

по истечении 2000 мс setTimeout будет сохраняться от очереди задач до стека вызовов и будет выполняться

console.log('This is printed after 2 seconds');
1 голос
/ 17 апреля 2020

Для ожидания работы с setTimeout setTimeout должен вернуть обещание. Пожалуйста, смотрите это: Как сделать обещание от setTimeout

...