Как мне пройти «асинхронный процесс» с Node Express? - PullRequest
0 голосов
/ 08 февраля 2019

У меня много асинхронных функций в моей системе, поэтому мне нужно идти «асинхронно до конца», то есть до момента, когда создаются приложения http.Server и express.Application.

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

Но я не уверен в синтаксисе Node / TypeScript, который будет использоваться для начальной загрузки приложения.

Моя основная точка входа - System.ts:

class default export System {

  public constructor() {
    // init Express.Application
    // init http.Server
    // init other parts of the system
  }

  public async start(): Promise<void> {
    // start the system asynchronously
    // start listening with http.Server
  }

}

Тогда у меня есть модуль начальной загрузки Main.ts:

import System from "./System"
const system = new System();
export default ???;                      // PROBLEM IS HERE

, который должен быть запущен:

node ./dist/Main.js

Но я не уверен, что использовать вэкспортная линия.Я попробовал все это:

export default await system.start();     // doesn't compile (obviously)
export default system.start();           // doesn't seem right
export default system.start().then();    // this works *maybe*

Последняя строка работает на основе теста на дым - но я не уверен, что это способ сделать это, и есть ли что-то в этой строке, что может дать сбой.

Каков канонический способ запуска приложения для асинхронных узлов?


ОБНОВЛЕНИЕ
Исходя из ответа @ JacobGillespie, модуль самозагрузки Main.ts теперь:

import System from "./System"
new System().start().then();
//new System().start().catch(e => console.error(e));  // alternative

В моем случае System.ts имеет обработчики для ошибок и необработанных обещаний, а также ведет протоколирование (в противном случае используйте строку «альтернативный»).Таким образом, модуль начальной загрузки просто загружает систему.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

async / await здесь работают с обещаниями, поэтому вы, по сути, хотите «запустить» обещание, вызвав .then или .catch.

Мой фрагмент кода для этогосоздание асинхронной run или main функции, затем присоединение обработки ошибок к процессу, что-то вроде этого:

async function run() {
  // run the app, you can await stuff in here
}

run().catch(err => {
  console.error(err.stack)
  process.exit(1)
})

В вашем случае это будет выглядеть так (Main.ts):

import System from "./System"

async function run() {
  const system = new System()
  await system.start()
}

run().catch(err => {
  console.error(err.stack)
  process.exit(1)
})

Вам не нужно ничего экспортировать, поскольку этот файл модуля больше нигде не импортируется (это файл ввода).

Вы можете просто позвонить system.then() или system.catch(), нолично мне нравится шаблон async function run(), поскольку в будущем вам может потребоваться согласовать несколько асинхронных элементов, и это делает код более явным.

0 голосов
/ 08 февраля 2019
system.start().then() => {
    value => export default value
}

На мой взгляд, лучше было бы: System.ts:

function System():Promise<string>{
    //setup express and the server
    return new Promise((res,rej) => {
        //the server var is just the http server instance
        server.listen(8000,() => resolve("server created"));
    });
}
export {System}

А потом в Main.ts:

import {System} from "yourpath"

А потом:

System().then(() => {
    //code runs when server is created
}).catch(err => console.error(err));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...