Узел завершается при запуске под планировщиком задач Windows без ошибок и не ожидает обещания / обратного вызова - PullRequest
0 голосов
/ 27 октября 2019

Мои основные наблюдения:

  1. Если в цикле forEach выполняется асинхронная функция, например: await Object.keys(o).forEach(function(key) { an_async_func() }

Тогда она не запускается.

Однако, когда я изменяю тот же код на: for (var key in o) { an_async_func() }

Затем он запускается.

Вне планировщика задач, как и из CLI Windows, оба случая будут работатьПрекрасно работает асинхронная функция.

Я попытался создать минимальный жизнеспособный пример, но он не демонстрирует той же проблемы (пример, который я составил, ниже для того, чего он стоит).

'use strict'

const timeoutPromise = (time) => {
    return new Promise((resolve, reject) => { setTimeout(() =>
        { console.log('timeout=',time); resolve('done') }, time) })
}

async function main() {
  var o = { a:1,b:2 }

  await Object.keys(o).forEach(function(key) {
     timeoutPromise(5000)
     console.log(key)
  })
}

main() 

ИтакЯ все еще ломаю голову над тем, в чем проблема.

1 Ответ

0 голосов
/ 27 октября 2019

await Object.keys(o).forEach не работает, потому что .forEach не возвращает Promise, оно возвращает void. await просто работает с Обещанием (или thenable объектом).

В этом случае просто используйте for loop без обратного вызова (.forEach(callback)) в качестве for in, и вам нужно awaitасинхронная задача (если вы хотите дождаться ее завершения)

'use strict'

const timeoutPromise = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('timeout=', time);
      resolve('done');
    }, time)
  })
}

async function main() {
  var o = {
    a: 1,
    b: 2,
  }

  for (const key in o) {
    await timeoutPromise(5000); // sleep
    console.log(key)
  }
}

main() 
...