1

的背景

我正在节点中编写我的下一个服务器项目。以前的版本是用语言 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方式对我来说更直接,但我有两个担忧:

  1. 它需要针对目标平台进行编译,因此部署过程对于生产来说会很复杂。
  2. 我检查了它的问题列表。有一些已知的严重问题,例如在某些极端情况下挂起。

问题

即将到来的新功能async/await真的可以做同样的事情deasync吗?如果由于 JS 的性质,它永远不会发生。我可能会停止思考这个问题。

请在前往节点的路上与我分享一些灯。

4

1 回答 1

1

我不太了解它是如何deasync工作的,我看了一下它,看起来很方便,但我不认为它被认为是通过服务器中的所有代码使用的。

一点点性能降级

这取决于你的情况,但它可能不仅仅是一点点降级。您将所有异步方法包装在代码中,这通常听起来不太好。做一个基准测试可能是个好主意。

其他的:

因为节点及其节点模块可能使用不同的异步方法(回调、承诺和等待/异步)

一般来说,模块遵循回调风格,承诺风格,或两者兼而有之。大多数大的都与它们兼容(通常,如果您不传递回调,则返回 Promise)。

async/await不同的是,这在 Promise 之上工作,因此可以async/await在您的代码中使用返回 Promise 的模块方法。

所以回答你的问题,我会在整个代码中坚持使用 Promises,这是现在的趋势,一般来说,与回调相比,它们更容易处理。

对我来说async/await是最简单的方法,因为它保持异步调用,但代码是以同步方式编写的。遗憾的是,目前async/await只能通过标志在 Node.js 中使用,因此不建议在生产中使用。

于 2017-01-14T06:35:03.163 回答