// запомнили в x значение 0
x = 0;
// запомнили в y значение -200
y = -200;
// тут выражение из нескольких действий
x = 0 * x + 1 * y
// 1. вместо переменных подставим значения
// 0 * 0 + 1 * -200
// 2. посчитаем умножения
// 0 + -200
// 3. посчитаем сложения
// -200
// запомним -200 в x
// на этом этапе у нас в x запомнено -200 и в y тоже -200
// с этим проделайте по аналогии
y = -1 * x + 0 * y
function render(message) {
const p = document.createElement("p"); // создали p, его еще нигде нет в DOM, все ok
p.textContent = message;
windowChatUser1.append(p); // поместили наш p в windowChatUser1, с этого момента он есть в DOM
windowChatUser2.append(p); // переместили наш p в windowChatUser2
}
логично, что из windowChatUser1 наш p исчез при перемещении в windowChatUser2, так как один элемент не может быть в двух родителях сразуwindowChatUser2.append(p.cloneNode(true));
.slider__slide {
/* изменяем внешний контейнер на viewport величины */
height: 100vh;
width: 100vw;
}
/* прописываем высоту внутренним контейнерам */
.slick-list, .slick-track {
height: 100%;
}
const ApiServiceModule = {
get: (url: string): Promise<unknown> => fetch(url)
.then(response => response.json())
.catch(err => console.error(err))
}
if (document.URL.indexOf("/testurl/") != -1);
if обрабатывает пустую операцию, все что дальше уже вне if// проиндексируем по ключам
const [rootIndex, idIndex] = array.reduce(([roots, ids], obj) => {
(roots[obj.root_id] ??= []).push(obj);
ids[obj.id] = obj;
return [roots, ids];
}, [{}, {}]);
// и найдем по нему нужные объекты:
const objectsWithoutExistingParent = Object.keys(rootIndex).filter(key => !idIndex.hasOwnProperty(key)).flatMap(key => rootIndex[key]);
console.log(objectsWithoutExistingParent);
const html = (lang) => () => {
return gulp.src("source/*.html")
.pipe(rename({suffix: lang}))
.pipe(gulp.dest("build"));
};
exports.html = html;
проблем с удалением событий не былоРазве?
const listener = event => console.log(event);
element.addEventListener('click', listener);
element.removeEventListener('click', listener);
element.addEventListener('click', event => console.log(event));
element.removeEventListener('click', event => console.log(event));
ибо это 2 разные функции, не смотря на то, что делают одно и то же, и одинаковы до каждого символа.когда программировал в функциональном стилето что в обоих Ваших примерах - это процедурный стиль. От того что Вы завернули код в класс - он не становится ООП, как и то что написали набор функции - не ФП.
function sum(value) {
return (function next(previousSum) {
return Object.defineProperty(function nextSum(value) {
return next(previousSum + Number(value));
}, 'valueOf', {value() {
return previousSum;
}});
})(Number(value));
}
one = sum(1)
two = one(1)
three = one + two // 3
const setup = {port:8000}
const express = require ('express');
const puppeteer = require('puppeteer');
const app = express ();
app.get('/', (req, res) => {
const url = req.query.url;
// вот тут Вы на каждый запрос создаете весьма тяжелую функцию
// в ней 203 AST ноды
// и она жрет в среднем 220КБ оперативы
// (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
let scrape = async () => {
// а еще на каждый запрос запускам новый браузер
// у ноды это особо памяти не отнимет, а вот у системы - прилично
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
// еще и разрешаем запросу из браузера жить вечно
// если конечно сервак не оборвет коннект
await page.setDefaultNavigationTimeout(0);
await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
await page.setViewport({width: 375, height: 812});
// куда мы отправляем браузер?
// переменная url у нас из req.query.url - а следовательно начинается с /
// то есть без хоста и протокола...
await page.goto(url);
// что-то мне подсказывает, что это работает не совсем так
// как Вы ожидаете
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
// читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
const bottomSheet = await page.evaluate(() => {
return document.querySelector('div[data-marker="bottom-sheet"]');
});
// так как undefined !== null данное условие всегда истинно
if (bottomSheet !== null) {
// здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
await page.click('div[data-marker="bottom-sheet"] button');
}
// и еще раз... ловите доку на нужный метод:
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
const phoneButton = await page.evaluate(() => {
return document.querySelector('a[data-marker="item-contact-bar/call"]');
});
// всегда ложное условие...
if (phoneButton === null) {
await browser.close();
return false; // ...с return внутри...
}
// еще 1 способ зависнуть (дефолтный таймаут 30 сек)
await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
await page.click('a[data-marker="item-contact-bar/call"]');
try {
await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
} catch (e) {
await browser.close();
return false;
}
const result = await page.evaluate(() => {
console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
});
await browser.close();
return result;
};
// не ловим reject промиса
// и в случае reject не завершаем запрос
// и он тоже висит в памяти
scrape().then((value) => {
console.log(value);
if (value === false)
res.send(500);
// при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
res.send(value);
// абсолютно бесполезное действие...
scrape = null;
});
});
app.get('/test', (req, res) => {
res.send('Тест');
});
app.listen(setup.port, () => {
console.log('Сервер: порт %s - старт!', setup.port);
});
export const Auth: React.FC = () => {
const onChange1 = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {}, []);
const onChange2 = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {}, []);
return(
<Child Parent = {{onChange1, onChange2}}/>
)
}
export const Child: React.FC<Props> = ({onChange1, onChange2}) => {
drWr[this.d].removeEventListener('click', this);
cell[i] >= cell[i - 1]
, то строка/столбец подходят под условия задачи и их нужно посчитать