Изучаю на досуге Node.JS по сайту nodebeginner.ru
Одним из пунктов является реализация ответа сервера в варианте
"как надо" и
"как не надо". Не буду приводить код оригинала, выложу свой:
app.js (стартовый)
// modules
var server = require('server');
var router = require('router');
var requestHandlers = require('requestHandlers');
var handle = {};
handle["/"] = requestHandlers.index;
handle["/index.htm"] = requestHandlers.index;
handle["/dir"] = requestHandlers.dir;
handle["/upload"] = requestHandlers.upload;
server.start(router.route, handle);
server.js
var http = require("http");
var url = require("url");
function start(route, handle) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
// console.log("Request for " + pathname + " received.");
route(pathname, handle, response);
// response.writeHead(200, {"Content-Type": "text/plain"});
// response.write("Hello World");
// response.end();
}
http.createServer(onRequest).listen(1337);
console.log("Server has started.");
}
exports.start = start;
router.js
function route(pathname, handle, response) {
// console.log("About to route a request for " + pathname);
if (typeof handle[pathname] === 'function') {
return(handle[pathname](response));
} else {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("File not found.");
console.log("No request handler found for " + pathname);
}
}
exports.route = route;
requestHandlers.js
function sleep(callback, milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
callback();
}
function index(response) {
// console.log("Request handler 'index' was called.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Request handler 'index' was called.");
response.end();
}
function dir(response) {
// console.log("Request handler 'index' was called.");
sleep(function(){
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Request handler 'dir' was called.");
response.end();
}, 10000);
}
function upload(response) {
// console.log("Request handler 'upload' was called.");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Request handler 'upload' was called.");
response.end();
}
exports.index = index;
exports.dir = dir;
exports.upload = upload;
Собственно в
"как надо" в гайде пишется, что нужно передавать
response в
requestHandlers.js дабы им можно было пользоваться асинхронно. Как "замедлитель" дана функция
sleep.
В общем в моем случае чуда не произошло - приложение при переходе по пути
/dir блокируется и другие запросы также ждут 10 секунд. Почему так? Что я сделал не так?
PS
В оригинале автор почему-то не рассмотрел решение этой задачи, а тупо взял готовую функцию
exec и использовал её callback.
upd.
Алексей Тен: посоветовал пользовать setTimeout, что сработало. Но все же вопрос актуален, как поправить sleep()?