console.log(new Date("2020-05-22 16:24:16")); // работает
const lastMessage = messages[messages.length - 1];
console.log(lastMessage);
const lastMessage = messages.reduce(([maxDate, maxMessage], currentMassage) => {
const currentDate = new Date(currentMassage.created);
if(currentDate > maxDate) {
return [currentDate, currentMassage];
}
return [maxDate, maxMessage];
}, [-Infinity, null])[1];
console.log(lastMessage);
Array.isArray(new Map()) // false
Здесь есть вот такая штука [[Entries]]. А entries возвращает массив свойств объектаВообще-то entries возвращает итератор. Итератор - это тоже не массив.
Что делать если размер запроса больше чем размер буфера?Читать в цикле. read вообще не гарантирует, что заполнит буфер полностью, но больше его размера он точно за раз не прочитает. А еще он возвращает
io::Result<usize>
, в котором сообщает, сколько реально байт было прочитано.1.1) Нужно будет читать пока не найдется CRLF в буфере ?Пока read не вернет
Ok(0)
, ну или ошибку. Хотя с ошибкой не все так однозначно, согласно доке может вылететь Err(io::ErrorKind::Interrupted)
при котором стоит повторить попытку чтения. Вообще CRLF будет после каждого заголовка, а когда заголовки закончатся будет 2 CRLF подряд, а потом еще может быть тело запроса, а может и не быть.1.2) для этого мне нужно пройтись по буферу и искать CRLF . если его нет то очистить буфер и продолжать читать ?нет, нужно распарсить то что пришло, куда-то сохранить, а потом продолжить чтение.
2) Как отделять один http запрос от другого ?Если у нас не keep-alive, то каждый запрос будет в отдельном соединении, но keep-alive наступает только если обе стороны прислали заголовок
Connection: keep-alive
Можете сделать по простому, и отвечать с заголовком Connection: close
, все равно в учебном проекте производительность у Вас будет никакая. Но если хотите все же заморочиться, то правило тоже не сложное - следующий запрос начинается в следующем же байте, где закончился текущий. Размер тела запроса в байтах можно узнать из заголовка Content-Length, а если его нет, то можете считать, что его значение 0.что-то мне кажется что надо слеши экранировать пробовал так /\ ничего не выходитДа, обратный слэш нужно экранировать, так как он сам является экранирующим символом, прямой же слэш не экранирует, поэтому ничего не выходит
path.normalize( '//192.168.1.5/C$/data/data.json' )
const cnt = document.querySelector('.container')
тип можно вывести однозначно - это тип Element, а все потому, что TS знает, что значение в const точно не изменится и просто берет возвращаемый тип для document.querySelector и выводит подсказки для него.// @ts-check
в начало файла, и Вы получите сразу и больше подсказок, и некоторый контроль типов. Так же добавлю, что в js файлах можно аннотировать типы через jsdoc:// @ts-check
export class Page {
constructor(selector, options) {
/** @type Element */
this.$element = document.querySelector(selector)
this.$element // тут работают подсказки после точки для типа Element
}
}
declare module '*.css' {
const classes: Readonly<Record<string, string>>;
export default classes;
}