nodejs запускает асинхронную функцию один за другим - PullRequest
0 голосов
/ 22 декабря 2018

Я новичок в JS / nodejs, поэтому, пожалуйста, простите меня, если я не могу задать конкретный вопрос.

Таким образом, в принципе, если у меня есть две асинхронные функции,

async function init() {...}
async function main() {...}

Как я могу убедиться, что вызвал main () после того, как init () завершил свои асинхронные запросы?

В частности, я хочу использовать модуль https://www.npmjs.com/package/hot-import

, тогда как на его странице есть пример кода:

async function main() {
  const MODULE_CODE_42 = 'module.exports = () => 42'
  const MODULE_CODE_17 = 'module.exports.default = () => 17'

  const MODULE_FILE = path.join(__dirname, 't.js')

  fs.writeFileSync(MODULE_FILE, MODULE_CODE_42)
  const hotMod = await hotImport(MODULE_FILE)
  . . .

Пример кода работает, как есть, но когдаЯ помещаю это в функцию обратного вызова события, все начинает ломаться - это работает для первого триггера события, но не для второго.

Я думаю, что проблема не в константе hotMod, а в await hotImport в async функция, которая вызывает проблему.Таким образом я пытаюсь определить hotMod как глобальную переменную и сделать hotMod = await hotImport(MODULE_FILE) в async init() функции до вызова main().Но пока я не смог, так как я довольно новичок в JS / nodejs.

Пожалуйста, помогите.Спасибо.

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

с использованием aysnc await

async function myFlow(){
.....
await init();
main();
....
}

В приведенном выше коде main () будет вызываться только при разрешении init ().Я надеюсь, что это поможет вам.

0 голосов
/ 23 декабря 2018

Чтобы запустить их синхронно, просто выполните:

await init()
await main()
0 голосов
/ 22 декабря 2018

Асинхронная функция возвращает обещания.Таким образом, вы должны иметь возможность вызывать один за другим с помощью then()

init()
.then(() => main())

Если init возвращает что-то (например, hotMod), вы можете подобрать его в качестве параметра для обратного вызова затем.

init()
.then((init_return) => {
   // do something with init_return
   return  main()
})
...