异步与现实中的异步

Async vs Deasync in reality

背景

我正在用 node.js 编写我的下一个服务器项目。之前的版本是用D语言写的,主要是同步实现。我们都知道,JS 大量使用 async 这对性能有好处,但很难维护(至少对我而言)。因为节点及其节点模块可能使用不同的异步方法(回调、承诺和 await/async),这使得代码看起来风格不一致。我正在寻找一种平衡的方法,它不仅可以创建高质量和高性能的节点应用程序,而且适合通用的编程风格。

问题

第一轮原型制作完成后,我有了自己的第一台服务器。当我启动服务器时,它会首先读取配置,然后加载一组模块。我希望它们按顺序加载。但正如我上面提到的,节点模块可能以异步方式工作。我希望模块 b 在加载模块 a 时准确加载,我必须使用 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 的性质而永远不会发生。我可能会停止考虑这个。

请分享我前往节点的路灯。

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

little bit performance downgrade

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

其他:

Because node and its node modules might use different async approach (callback, promise and await/async)

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

async/await 不同,它在 Promises 之上工作,因此 returns Promise 的模块方法可以与代码中的 async/await 一起使用。

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

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