編輯:我們可以關閉。 Isn't truly asynchronous, non-blocking javascript impossible?Node.js是否真的異步執行後臺I/O任務?
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);
- 複製內容到一個文件中。
- 執行該文件。
- 在瀏覽器中打開一個新選項卡。將url設置爲
localhost/1
。不要走了。 - 在瀏覽器中打開一個新選項卡。將網址設置爲
localhost/2
。不要走了。 - 回到第一個選項卡。按下回車鍵並在切換到第二個選項卡後立即按下回車鍵。
結果:
控制檯日誌:
標籤1:我在
標籤1:我做
標籤2:我在
標籤2:我完成選項卡1等待5秒鐘以接收結果「1」。
- 選項卡2還必須等待5秒,因爲選項卡1正在休眠5秒鐘。
該文檔說,除代碼外,所有代碼都是異步的。只有一個線程。一次只有一個請求。請求被排隊。
I/O調用應該是異步的,對嗎?那爲什麼如果回調來自異步I/O進程,爲什麼選項卡2必須等待選項卡1?
謝謝。
在節點中有一個虛假的「睡眠」方法是* ragequit * – jAndy 2012-03-27 20:20:34