交叉从Reddit发布。
JavaScript中异步函数的用途与您寻求的有点不同。
请记住,JavaScript是单线程的 - 它一次只能做一件事。下面是一些传统的,阻塞代码:
sys.puts("Before");
sleep(10);
sys.puts("After");
在真实世界中的Web应用程序中,sleep()
可能反而是一个耗时的数据库调用,网络请求(如从用户的Web浏览器等待数据),帮手工具或文件访问。
如果您使用类似上述的阻塞调用,则Node.js服务器在等待时无法执行其他任何操作(如开始处理其他Web请求)。
PHP和许多其他Web编程环境通过为每个请求创建完全独立的线程来处理此问题。 Node.js使用回调函数。你可以写相同的代码是这样,而是:
sys.puts("Before");
setTimeout(function(){
sys.puts("After");
}, 10000);
在这里,你创建一个函数,并把它传递给setTimeout()
。它的代码还没有运行,但是当它运行时,它将访问它创建的所有范围(所有变量)。 setTimeout()
获取对该功能的引用,并在超时到期后安排要在the event loop上触发的事件。
事件循环本质上是一个Node.js程序的待办事项列表(它们很常见 - 您的计算机上运行的所有GUI应用程序都可能使用事件循环!)。
呼叫setTimeout()
后,当前函数继续执行。它最终返回,并调用它的函数返回,等等,直到程序结束回事件循环。事件循环查看代码执行时是否发生任何事情(例如传入请求),并在代码中调用相应的函数。如果没有,则等待发生(如超时到期)。
异步代码不让你的代码在同一时间做很多事情,它并消除当一些代码依赖于外在的东西继续阻止。
很少有您需要在Node.js程序中阻止工作。如果你这样做了,你应该把这个工作分解成一个单独的进程(甚至可以是另一个Node.js程序),或者编写可以自由使用线程的a C/C++ addon。
来源
2011-08-01 19:30:13
s4y
你知道我在node.js中如何实现这个功能吗?谢谢 – Richard 2010-05-20 21:37:58
这个问题很老旧,但对于像我这样的node.js初学者来说,仍然非常有趣。如前所述,node.js是针对并行I/O而非并行工作的。这意味着:如果你有一个耗时的工作来响应单个请求node.js不会加快你在单个请求中尝试实现的内容。 使用sleep()和setTimeout()之间的区别在于,当使用sleep()进行睡眠时,node.js将阻止所有其他请求 - 使用setTimeout()将不会阻止其他请求。或者:10个睡眠请求(10s)将需要100s - 10个请求setTimeout(10s)只需10s。 – schlicki 2016-03-04 19:49:54