Leo
держишь асинхронно?
да, это то, что я хочу сделать
сomorsiс
каждый получит ответ через N секунд
Leo
Нет, не синхронно
да как это, я тестил и пока ответ не отправлен, он не хочет приступать к след. соединению
Deleted
потому что основной тред один
тред один для JS а есть еще фоновые треды для I/O это вопрос к тем кто подробное знает как модули http и fs работают
Олександр
Leo
я понимаю что тред один, но он разве не должен ставить входящие соединения в eventLoop?
сomorsiс
они обработаются последовательно
окей, фикс если обработчик обрабатывает без асихнронности, то они последовательно обработаются
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? Как правильно юзать фильтры, может подсказать?
Igor
{% filter upper %} This text becomes uppercase {% endfilter %} Если написать так, то падает с ошибкой
Leo
как-то так
Igor
пользовался, через | filter_name args
Ага, ща попробую и этот способ. Видимо вариант выше это пхпшная запись чисто
Igor
Спасибо
Deleted
@Leo дай полный код
Deleted
По тому куску не ясно с какой частотой интервалы срабатывают и нет ли у тебя там утечек таймеров
Leo
@Leo дай полный код
https://pastebin.com/vEtrJFRL
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
5 секунд же задержка
Leo
5 -6 секунд
Leo
все вместе
Leo
они же должны быть асинхронными
Deleted
в сумме выходит 10 секунд?
Deleted
на оба запроса?
Leo
да
Deleted
тогда вопрос к клиенту на сервере все абсолютно правильно
Leo
тогда вопрос к клиенту на сервере все абсолютно правильно
ты имеешь в виду, что пока не закончилось получение первого запроса, клиент не посылает второй?)
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
Deleted
koa
я за выбор коммюнити, больше пользователей - больше примеров и сторонних модулей)
Deleted
на практике работает
Deleted
на коа раньше сидел
Leo
почему ушел?
Deleted
уже сказал - там где больше коммюнити пользователей, больше полезных модулей
Deleted
меня это не раз спасало
Deleted
express - 18 миллионов скачиваний koa - 480 тысяч
Cenator 🐈
всем fastify, пацаны