сomorsiс
каждый получит ответ через N секунд
Leo
Нет, не синхронно
да как это, я тестил и пока ответ не отправлен, он не хочет приступать к след. соединению
Deleted
потому что основной тред один
тред один для JS
а есть еще фоновые треды для I/O
это вопрос к тем кто подробное знает как модули http и fs работают
Олександр
Leo
я понимаю что тред один, но он разве не должен ставить входящие соединения в eventLoop?
Leo
я посылал из браузера
Leo
просто открыл 2 разных страницы
倫太郎
ща бы делать http сервер без express'а...
Олександр
просто открыл 2 разных страницы
Нет кода - нет ответа. Они обрабатываются асинхронно, нода не будет ждать окончания предыдущего перед обработкой следующего
Leo
async function serveClient (clientId) {
return new Promise((resolve, reject) => {
var startTime = new Date().getTime();
var interval = setInterval(function printUTCDateTime () {
var endTime = new Date().getTime();
const timeElapsed = endTime - startTime;
console.log(clientId, getUTCDateTime(), timeElapsed, startTime, endTime);
if (timeElapsed >= closeConnectionAfterMs) {
clearInterval(interval);
resolve(getUTCDateTime());
}
}, intervalDelay);
});
}
async function handleClient (request, response) {
let res;
if (request.method === 'GET' && request.url === '/') {
let clientId = ++client;
try {
res = await serveClient(clientId);
console.log('Served client successfully', res);
} catch (error) {
console.log('ERROR!!!!!!!!!!!!!!!!', error);
}
}
response.end(res);
}
console.log('Server started...');
http.createServer(handleClient).listen(port);
Leo
обновил)
Leo
getUTCDateTime возвращает string
Denys
А зачем async, если выозвращаете промис?
Leo
чтобы код выполнился асинхронно
Олександр
Твоя async функция и так вернет промис ибо она async
async function serveClient (clientId) {
return new Promise((resolve, reject) => {
Leo
хотя я ж там еще await юзаю..
Олександр
async function serveClient (clientId) {
var startTime = new Date().getTime();
var interval = setInterval(function printUTCDateTime () {
var endTime = new Date().getTime();
const timeElapsed = endTime - startTime;
console.log(clientId, getUTCDateTime(), timeElapsed, startTime, endTime);
if (timeElapsed >= closeConnectionAfterMs) {
clearInterval(interval);
resolve(getUTCDateTime());
}
}, intervalDelay);
}
Igor
Кто-нибудь имел дело с Twig? Как правильно юзать фильтры, может подсказать?
Leo
Igor
{% filter upper %}
This text becomes uppercase
{% endfilter %}
Если написать так, то падает с ошибкой
Leo
Leo
как-то так
Igor
Спасибо
Deleted
@Leo дай полный код
Deleted
По тому куску не ясно с какой частотой интервалы срабатывают
и нет ли у тебя там утечек таймеров
Leo
делаю cleanInterval..
Deleted
с виду код должен без задержек отрабатывать
Deleted
300 ms на таймер не зайбьют event loop
сomorsiс
а почему на браузер никто не подумал?
Leo
приведу пример по-проще:
function handleClient (request, response) {
if (request.method === 'GET' && request.url === '/') {
setTimeout(() => {
response.end('Done');
}, 5000);
} else {
response.end('');
}
}
console.log('Server started...');
http.createServer(handleClient).listen(port);
Leo
каждый запрос будет отрабатываться по 5 секунд
Leo
т.е. оно будет держать соединение
Leo
ну это бред какой-то..
Deleted
Deleted
5 секунд же задержка
Deleted
Leo
Leo
5 -6 секунд
Leo
все вместе
Leo
они же должны быть асинхронными
Deleted
в сумме выходит 10 секунд?
Deleted
на оба запроса?
Leo
да
Deleted
тогда вопрос к клиенту
на сервере все абсолютно правильно
Deleted
const start = Date.now()
Promise.all([
fetch('/').then(p => p.text()),
fetch('/').then(p => p.text())
]).then(results => {
const duration = Date.now() - start
console.log('results', results)
console.log('duration', duration)
})
Deleted
со стороны браузера запусти
Leo
пишет 5 сек
Leo
да, дело в клиенте)
Deleted
видишь, паралельно
Leo
я только что протестил на двух разных урлах с одним и тем же обработчиков, и все заработало как должно
Leo
спасибо, разобрался!)
Deleted
а еще
Deleted
там у тебя был код с таймерами
Deleted
ща
Deleted
async function serveClient (clientId) {
const startTime = Date.now()
let timeElapsed = 0
while ( timeElapsed < closeConnectionAfterMs ) {
await delay(intervalDelay)
const endTime = Date.now()
timeElapsed = endTime - startTime
console.log(clientId, getUTCDateTime(), timeElapsed, startTime, endTime);
}
return getUTCDateTime()
}
Deleted
лучше писать без таймеров
Deleted
есть модуль delay
Deleted
для ожидания с помощью await'a
Leo
код будет чище или есть другие причины?
Deleted
меньше вложенности кода по блокам
код можно читать линейно, сверху вниз, гораздо понятнее
и меньше шанс допустить ошибку в очистке таймера и допустить утечку
Leo
понял, спасибо
Leo
еще вопрос, может быть async совсем не нужен, хоть там же while цикл есть..
Deleted
“await delay(intervalDelay)
“
Deleted
если есть await то нужен и async
Deleted
а вообще пиши сервер на express
и не трогай модуль http
сomorsiс
Deleted
koa
я за выбор коммюнити, больше пользователей - больше примеров и сторонних модулей)
Deleted
на практике работает
Leo
Deleted
на коа раньше сидел
Leo
почему ушел?
Deleted
уже сказал - там где больше коммюнити пользователей, больше полезных модулей
Deleted
меня это не раз спасало
Deleted
express - 18 миллионов скачиваний
koa - 480 тысяч
Cenator 🐈
всем fastify, пацаны