我的系统中有许多异步功能,因此我需要“一直向下同步”,这就是创建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
具有错误和未处理的Promise处理程序,并进行日志记录(否则使用“ alternative”行)。因此,引导模块仅引导系统。
答案 0 :(得分:1)
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()
模式,因为将来可能需要协调多个异步事务,这会使代码更加复杂明确的。
答案 1 :(得分:0)
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));