【发布时间】:2012-04-11 10:10:06
【问题描述】:
编辑:我们可以关闭。 Isn't truly asynchronous, non-blocking javascript impossible?
var PATH = require ("path");
var URL = require ("url");
var sleep = function (ms){
var start = new Date ().getTime ();
while ((new Date ().getTime () - start) < ms);
}
require ("http").createServer (function (req, res){
if (URL.parse (req.url).pathname === "/1"){
console.log ("tab 1: I'm in");
PATH.exists ("test", function (exists){
sleep (5000);
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("1");
console.log ("tab 1: I'm done");
});
}else{
console.log ("tab 2: I'm in");
res.writeHead (200, {"Content-Type": "text/plain"});
res.end ("2");
console.log ("tab 2: I'm done");
}
}).listen (80);
- 将内容复制到文件中。
- 执行文件。
- 在浏览器中打开一个新选项卡。将网址设置为
localhost/1。先别走。 - 在浏览器中打开一个新选项卡。将网址设置为
localhost/2。先别走。 - 返回到第一个选项卡。按回车键,在切换到第二个选项卡后立即按回车键。
结果:
-
控制台日志:
标签 1:我在
标签 1:我完成了
标签 2:我在
选项卡 2:我完成了 选项卡 1 等待 5 秒以接收结果“1”。
- 标签 2 也必须等待 5 秒,因为标签 1 正在休眠 5 秒。
文档说除了代码之外一切都是异步的。只有一根线。一次只能请求一个。请求已入队。
I/O 调用应该是异步的,对吧?那么如果回调来自异步 I/O 进程,为什么选项卡 2 必须等待选项卡 1?
谢谢。
【问题讨论】:
-
在节点中有一个假的
sleep方法是ragequit
标签: javascript http node.js asynchronous