const rangeVideo = async (player, mimeCodec, resource) => {
const mediaSource = new MediaSource;
player.src = URL.createObjectURL(mediaSource);
await new Promise(resolve => mediaSource.onsourceopen = resolve);
URL.revokeObjectURL(player.src);
const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
const response = await fetch(resource, { method: 'HEAD' });
const contentLength = response.headers.get('Content-Length');
const segmentLength = 1 * 1024 * 1024;
let fetchedLength = -1;
while (true) {
if (fetchedLength >= contentLength) break;
const response = await fetch(resource, {
headers:{'Range':`bytes=${fetchedLength+1}-${fetchedLength+=segmentLength}`}
});
const value = await response.arrayBuffer();
sourceBuffer.appendBuffer(value);
await new Promise(resolve => sourceBuffer.onupdateend = resolve);
//console.count();
//await delay(2000);
}
};
const streamVideo = async (player, mimeCodec, resource) => {
const mediaSource = new MediaSource;
player.src = URL.createObjectURL(mediaSource);
await new Promise(resolve => mediaSource.onsourceopen = resolve);
URL.revokeObjectURL(player.src);
const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
const response = await fetch(resource);
const readableStream = response.body;
const reader = readableStream.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) break;
sourceBuffer.appendBuffer(value);
await new Promise(resolve => sourceBuffer.onupdateend = resolve);
//console.count();
}
};
//const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const data = [
document.querySelector('video'),
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
'https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4',
];
//rangeVideo(...data);
//streamVideo(...data);
indexOf( ID )
в массиве, задающем порядок сортировки:var data = [
{ID: 1, country: 'England'},
{ID: 4, country: 'USA'},
{ID: 9, country: 'Russia'},
{ID: 5, country: 'Germany'},
{ID: 6, country: 'France'},
];
const order = [5,1,9,6,4];
data.sort((a,b) => order.indexOf(a.ID) - order.indexOf(b.ID));
/* [
{"ID":5,"country":"Germany"},
{"ID":1,"country":"England"},
{"ID":9,"country":"Russia"},
{"ID":6,"country":"France"},
{"ID":4,"country":"USA"}]
*/
data = data.map( e => {e.sortBy = order.indexOf(e.ID); return e;} );
data.sort( (a,b) => a.sortBy - b.sortBy);
- i while(<= arr){
+ i while(<= arr.length){
function one() {
const oneVar = 'Hello!'
let counter = 0;
console.log('функция one работает прямо сейчас, в счетчике', counter)
function two() {
console.log(oneVar, ++counter)
}
console.log('функция one почти завершилась, в счетчике все еще ', counter);
return two
}
const three = one();
console.log('функция one точно завершилась, даже return сработал');
console.log('в переменной three сейчас функция two()');
console.log(three);
three();
three();
three();
console.log('обожемой, мы видим как менялась переменная в уже завершенной функции. чераная магия? нет - это называется замыкание!');
"функция one работает прямо сейчас, в счетчике", 0
"функция one почти завершилась, в счетчике все еще ", 0
"функция one точно завершилась, даже return сработал"
"в переменной three сейчас функция two()"
function two() {
console.log(oneVar, ++counter)
}
"Hello!", 1
"Hello!", 2
"Hello!", 3
"обожемой, мы видим как менялась переменная в уже завершенной функции. чераная магия? нет - это называется замыкание!"
Consistent useEffect timing: React now always synchronously flushes effect functions if the update was triggered during a discrete user input event such as a click or a keydown event.
document
, дальше событие клика по кнопке продолжило всплывать и попало в только что установленный обработчик.При добавлении задержки, данная проблема уходит
document.addEventListener('click', handleOutsideClick, true);
return () => document.removeEventListener('click', handleOutsideClick, true);
вместо "Happy New Year!", я вижу это: "[object Object]appy New Year!"
reduce
. Особое внимание следует обратить на то, какие параметры он принимает, и что происходит, если указать не все.+
. Что бывает, если складываемые значения имеют различные типы.const str = strArr.reduce((acc, n) => (acc[n.index] = n.char, acc), []).join('');
user = new User()
{ constuctor: User }
. Если писать через class то мы конструктор явно прям зададим. )user.__proto__ === User.prototype
User.prototype.constructor === User
function User(x,y){
let name = x;
let age = y;
return {
name : name,
age : age,
sayHi: function(){
console.log("My name is " + this.name);
}
}
}
// Сохраняем исходные индексы и сортируем по высоте по убыванию
const preparedData = data
.map((e, i) => ({i, e}))
.sort((a, b) => b.e.height - a.e.height);
for (const el of preparedData) {
const { height } = el.e;
// тут никогда не вернет -1, так как мы ищем элемент который точно есть в массиве - минимальный
const index = columnHeight.indexOf(Math.min(...columnHeight));
// обновляем данные массивов по выбранному индексу
columnHeight[index] += height;
columns[index].push(el);
}
// нормализуем columns
for (let i = 0; i < columns.length; ++i) {
// восстановим исходный порядок, отсортировав по сохраненному индексу по возрастанию
columns[i].sort((a, b) => a.i - b.i);
// избавимся от сохраненных индексов, оставив только исходные объекты
columns[i] = columns[i].map(({ e }) => e);
}
// имена свойств можно передавать в виде массива
const pick = (obj, keys) => Object.fromEntries(keys.map(n => [ n, obj[n] ]));
const newObj = pick(obj, [ 'b', 'c' ]);
// или как отдельные значения
const pick = (obj, ...keys) => keys.reduce((acc, n) => (acc[n] = obj[n], acc), {});
const newObj = pick(obj, 'b', 'c');
const pickExisting = (obj, keys) =>
Object.fromEntries(keys.filter(n => n in obj).map(n => [ n, obj[n] ]));
const pickOwn = (obj, keys) =>
keys.reduce((acc, n) => (Object.hasOwn(obj, n) && (acc[n] = obj[n]), acc), {});
const pick = (obj, filterFn) => Object.fromEntries(Object.entries(obj).filter(filterFn));
const obj1 = pick(obj, ([ key, val ]) => 'abc'.includes(key) && val % 2); // {a: 1, c: 3}
const obj2 = pick(obj, n => n[1] > 2); // {c: 3, d: 5}
interface RequestModel<T> extends Request {
body: T
}
class UserRegisterModel {
first_name: string;
last_name: string;
email: string;
password: string;
constructor({first_name}) {
this.first_name = firstname;
// И так все НУЖНЫЕ поля
}
}
app.post('/register', async (req: RequestModel<UserRegisterModel>, res) => {
if(req.body) {
const user = new UserRegisterModel(req.body);
// Хоба и лишних полей нет ))
}
});