有没有办法同步编写 node.js 代码? [关闭]
Posted
技术标签:
【中文标题】有没有办法同步编写 node.js 代码? [关闭]【英文标题】:Is there a way to write node.js code synchronously? [closed] 【发布时间】:2018-05-23 16:29:37 【问题描述】:我正在尝试创建一个分析某些数据的程序。我使用 node.js 从互联网收集的数据。我很难接受代码是异步的这一事实,因此我遇到了很多错误。
我知道它根本没有效率,但是有没有办法同步编写整个代码?
*我使用了很多 Promise 并修补了很多错误,但我仍然不断遇到错误,因为代码是异步的,而且我已经厌倦了思考让我的代码工作的创意。
【问题讨论】:
大多数异步函数都有 API,因此您可以传递要调用的回调。你试过了吗? 您可以查看自 nodejs 7.6 (infoq.com/news/2017/02/node-76-async-await) 以来支持的async
/await
构造。您的代码看起来像同步和异步函数,如果使用 await
前缀调用,将有效地暂停调用者执行,直到它完成。
您是否考虑过 javascript 在这里可能是一种糟糕的选择语言? Python 或 php 可能更合适
@AndrewStarostin 另外async
/await
不会将 Node.js 变成一个同步平台,它只是看起来同步。您仍然需要了解底层的异步概念。
如果您从互联网获取数据,那么最好使用 Promise,可能有一种阻止 xmlhttprequest 的方法(不确定现在是否已完全删除),它不会阻止您在节点中的浏览器应用程序,但您的代码运行速度可能会慢很多。如果您了解为什么使用 Promise 以及您编写的代码如何是非阻塞的(任何函数都会立即返回一个值),那么它确实会变得更容易。请记住,async
不会在新线程上运行,await
函数将立即返回一个承诺,它们不会等待任何东西。 ***.com/a/47678417/1641941视频链接很好。
【参考方案1】:
如果您正在使用网络(听起来您要从其他来源检索数据),那么不,您不能在 node.js 中编写同步网络代码。不存在。 node.js 中的所有网络 API 都是异步的。
要使用 node.js 网络,你必须学习异步编程。
可以只使用在服务器请求处理中永远不应该使用的同步文件 I/O(因为它会破坏可伸缩性),但有时在服务器启动和非服务器类型的脚本中很有用。
【讨论】:
为什么投反对票?【参考方案2】:这在很大程度上取决于您使用的功能。当然你可以编写一个完全同步的 Node.js 程序——你只需要避免使用异步的 any 函数。
但由于 Node.js 本质上是异步的,我怀疑这是否适用于更复杂的事情。由于您提到从网络加载数据:只是 this 已经是 Node.js 中无法同步完成的任务示例,因为 Node.js 中的任何 I/O 始终是异步的(除了存在两次的文件系统方法,但它们是规则的例外)。
我认为解决您的问题的方式更好的方法是使用与 Node.js 不同的平台,或者适当地学习处理异步代码。
我猜这不是您想听到的答案,但不幸的是,恕我直言,这就是它的方式。
【讨论】:
以上是关于有没有办法同步编写 node.js 代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 Node.js 同步/异步性能和速度中移动 100.000 多个文件 [关闭]
Node.js 中 JSON 对象中的 JSON 对象 [关闭]