Редактировать: Мы можем закрыть. Isn't truly asynchronous, non-blocking javascript impossible?Действительно ли Node.js выполняет задачи ввода-вывода в фоновом режиме?
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
. Не уходи. - Откройте новую вкладку в браузере. Установите URL-адрес
localhost/2
. Не уходи. - Вернитесь на первую вкладку. Нажмите «Ввод» и сразу после перехода на вторую вкладку и нажмите «Ввод».
Результат:
консоли журнала:
Вкладка 1: Я в
вкладке 1: Я сделал
Вкладка 2: Я в
вкладке 2: Я закончилВкладка 1 ждет 5 секунд, чтобы получить результат «1».
- Вкладка 2 также должна ждать 5 секунд, так как вкладка 1 спала в течение 5 секунд.
Документы говорят, что все асинхронно, за исключением кода. Только один поток. Только один запрос за раз. Запросы помещаются в очередь.
Предполагается, что вызовы ввода/вывода являются асинхронными, верно? Тогда почему вкладка 2 должна ждать перехода на вкладку 1, если обратный вызов поступает из процесса асинхронного ввода-вывода?
Спасибо.
, имеющий поддельный метод 'sleep' в узле * ragequit * – jAndy