的背景
我正在节点中编写我的下一个服务器项目。以前的版本是用语言 D 编写的,主要是同步实现。我们都知道,JS 使用了很多 async 这对性能有好处,但很难维护(至少对我来说)。因为 node 和它的 node 模块可能使用不同的异步方法(回调、promise 和 await/async),这使得代码看起来不一致。我正在寻找一种平衡的方法,它不仅可以创建高质量和高性能的节点应用程序,而且适合常见的编程风格。
问题
在第一轮原型设计之后,我有了我的第一台服务器。当我启动服务器时,它会首先读取配置,然后加载一组模块。我希望它们按顺序加载。但正如我上面提到的,节点模块可能以异步方式工作。我希望在加载模块 a 时准确加载模块 b,我必须使用Promise
模式。我必须以疯狂的方式编写代码,尽管Promise
这已经是一种对程序员非常友好的方法。
不,我去另一个方向。目前我选择deasync
,它是 node 的 gyp 模块。它真的可以像这样阻塞代码执行。
const deasync = require('deasync');
let done = false;
loadModule1Async((err, result) => {
done = true;
});
deasync.loopWhile(() => !done);
done = false;
loadModule2Async((err, result) => {
done = true;
});
deasync.loopWhile(() => !done);
或者像这样更神奇
const deasync = require('deasync');
const loadModule1Sync = deasync(loadModule1Async);
const loadModule2Sync = deasync(loadModule2Async);
try {
loadModule1Sync();
loadModule2Sync();
} catch(ex) {
console.error(ex);
}
IMO,这种deasync
方式对我来说更直接,但我有两个担忧:
- 它需要针对目标平台进行编译,因此部署过程对于生产来说会很复杂。
- 我检查了它的问题列表。有一些已知的严重问题,例如在某些极端情况下挂起。
问题
即将到来的新功能async/await
真的可以做同样的事情deasync
吗?如果由于 JS 的性质,它永远不会发生。我可能会停止思考这个问题。
请在前往节点的路上与我分享一些灯。