在 Node/Express 服务器中使用 async/await 是个坏主意吗?

Isa*_*sov 5 model-view-controller single-threaded node.js express async-await

我有一个 NodeJS/Express Web 应用程序,其中 TypeOrm 用于许多数据库功能。为了避免回调地狱,我通常使用async/await我的端点方法调用并等待数据库操作。
但是,我听说fs.readFileSync应该始终避免使用此类方法,因为它们会阻塞并强制所有其他请求等待。这也适用于async/await? 我是否必须使用承诺和回调来获得不错的多用户性能?

far*_*jad 7

不应该使用函数的原因*Sync是它们会阻塞事件循环。这会导致您的应用程序在执行同步函数时变得无响应。

当您处理异步代码时,Promise 可以帮助您避免回调地狱问题。此外,async/await语法允许您编写看起来像同步代码的异步代码。所以使用async和await就完全没问题了。


Ari*_*rty 6

Sync函数真正阻塞事件循环,直到 io 完成。但另一方面async-await只是 Promise 链的语法糖。它实际上不是同步的,它只是看起来像。这是您需要了解的最大区别。

但是,async-await使承诺过于连续会引入一些问题。

例如,两个独立的promise应该并行执行Promise.all但是当你使用async-await你倾向于做

await func1();
await func2();
Run Code Online (Sandbox Code Playgroud)

因此,从逻辑上讲,您可能会自己制造瓶颈。但在语法上它没有像同步那样的任何问题。

你可以用 Babel REPL 看看 ES5 转译,你可能会更好理解一点。

  • 很多时候,异步调用相互依赖并且需要按顺序执行:`const u = wait getUser(username); const posts = 等待 getPosts(u.id)`。独立的异步调用可以使用`Promise.all`,但这并不妨碍它们使用`await`:`const [a, b] = wait Promise.all([ func1(), func2() ])` (3认同)