nodejs - Заявления после ожидания Promise без разрешения пропускаются - PullRequest
1 голос
/ 16 октября 2019

При запуске следующего фрагмента, console.log('done.') пропускается:

function test (cb) {
  setTimeout(() => {
    console.log('2000ms passed')
    cb && cb()
  }, 2000)
}

async function run () {
  await new Promise((resolve, reject) => {
    // Doesn't run console.log('done') with test():
    // But if test(resolve), console.log('done.') will run
    test() 
  })
  console.log('done.')
}

run()

Почему test() без resolve не запускается console.log('done.')?

1 Ответ

2 голосов
/ 16 октября 2019

Обещание становится разрешенным только при вызове обратного вызова resolve. Если обещание не было разрешено или отклонено, оно остается в состоянии pending навсегда. Ключевое слово

Await используется для фактического «ожидания разрешения обещания», и в вашем примере это никогда не происходит.

Ваша функция test ожидает выполнения некоторой функции по истечении времени ожидания. Когда вы передаете resolve в качестве аргумента функции test, она будет вызвана по истечении времени ожидания, обещание будет выполнено и вы увидите журналы консоли.

Я не уверен, к какому результату вы пытаетесьдостичь, но вот короткий фрагмент кода, показывающий реализацию функции 2 секунды sleep:

function sleepTwoSeconds() {
  return new Promise(resolve => setTimeout(resolve, 2000))
}

async function run() {
  console.log('start');
  await sleepTwoSeconds();
  console.log('2 seconds passed');
}

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