在nodeJS中,一般的做法和建议是使用异步方法并对下一个函数进行回调。
我使用expressJS设置了一个nodeJS用于测试目的,我编写了 sync 和 async 方法。无论使用异步还是同步方法,这两种方法都能正常回答所有请求,而且没有任何可察觉的延迟。
虽然我在项目中使用了异步方法,但我读到的鼓励使用异步方法的文章并没有解释为什么深入。 同步方法会避免使用callback hell。
所以我很好奇,为什么不使用 sync 方法,因为它们都有效?它会通过使用一个或另一个来影响响应时间/性能吗?
答案 0 :(得分:5)
节点在单个线程上运行。如果您正在处理大量连接,那么肯定会有比CPU绑定任务更多的IO绑定任务。例如,DB调用。 在等待数据库查询结果时,您可以接收更多请求或执行其他作业。
当您需要执行受CPU限制的操作时,问题就开始了:可能需要很长时间的任务。您需要拆分任务,将其中的一小部分拆分,然后将其余部分安排到以后的时间直到完成,或者您可以将其委托给另一个服务器/进程,无论如何。
如果您决定同步,服务器在执行该作业时将不再处理任何请求。是的,你将避免回调地狱,但无论多长时间,从开始到结束都要做一件事。如果你试图处理很多连接,这将不会很好。
麻烦的一个很好的例子是for循环:
for (let x of ['some', 'huge', 'array']) {
// Do something heavy here, until it's not finished, server won't do
// anything more than this heavy task
}
在“做某事”时,服务器应用程序不会处理任何其他传入请求。当然,当你有更重的任务和大量的请求时,问题会很严重。
在严重的节点服务器中,您不需要同步循环,除非由于X动机,它比异步解决方案表现更好。因此,你可以使用setTimeout,setImmediate,process.nextTick,Promises等异步。并且,你可能采用的第一种方法是继续传递方式,这意味着传递回调以在工作完成后执行,并且可能你会遇到回调地狱墙。
这是你与Promises或发电机或两者兼顾的那一刻: https://davidwalsh.name/async-generators
这样,你将避免回调地狱,并获得更好的代码(主观)。你也许想要关注异步/等待:https://github.com/tc39/ecmascript-asyncawait。
您没有任何明显的优势,因为您是唯一提出请求的用户。用数千个连接进行测试。
Abrazo。
答案 1 :(得分:0)
嗯...
您可以将食物放入微波炉,同时洗澡,当您完成洗澡后,您可以(可能)将食物从微波炉中取出并食用。如果食物尚未准备好,你可以做其他事情直到它准备好了。那是异步的方式。
或者,您可以将食物放入微波炉中,盯着微波炉直至完成,吃完食物,然后洗澡。这是同步方式。
答案 2 :(得分:-1)
考虑下面的代码:
/now
首先调用 http://127.0.0.1/wait 然后 http://127.0.0.1/now:
productid
立即得到解答。一个线程不会相互干扰。
首先调用 http://127.0.0.1/wait 然后 http://127.0.0.1/wait:
第二个电话在第一个电话接听之前无法接听。一个线程会相互干扰。