Прошу прощения, давно уже не программировал, а тут понадобилось, может что-то упустил из новшеств. Помню, делал я сервера на nodejs, и, насколько я помню, там если в главном коллбеке пишешь синхронный код, выполнение блокируется.
Сейчас проверил, на всякий случай, на таком вот коде:
#!/usr/bin/nodejs
http = require("http")
flag = true
http.Server(function(req, res){
if(req.url === "/favicon.ico") {
console.log("favicon")
res.end()
return
}
var i = 10000000000
if(flag){
console.log("flag is true")
flag = false
console.log("flag setted to false")
while(i--) {}
console.log("cycle is done")
} else {
console.log("flag is false")
}
res.write("foo")
res.end()
}).listen(8888)
При обращении первого клиента флаг установлен в true, выполняется цикл, при обращении второго цикл не выполняется, поэтому, если бы цикл не блокировал, то второй клиент получал бы ответ сразу, но он ждет. В консоли пишет
flag is true
flag setted to false
cycle is done
flag is false
favicon
favicon
В общем, я подумал, что было бы намного проще и логичней, если бы этот коллбек был асинхронным сам по себе. Почему они так не сделали? Чтобы добавить асинхронность, нужно внутри этого синхронного коллбека городить еще асинхронный сверху, а это запутывает код.
Может эта фича есть, и я просто не знаю об этом?