результат времени как при параллельном выполнении
Получается что new Promise( уже запускает на выполнение код? Его можно как то отложить?
const getA = () => new Promise((resolve, reject) => {
console.time('getA');
setTimeout(() => {
console.timeEnd('getA');
resolve(4)
}, 6000)
});
const getB = () => new Promise((resolve, reject) => {
console.time('getB');
setTimeout(() => {
console.timeEnd('getB');
resolve(2)
}, 2000)
});
console.time('get sum');
getA().then(a => {
getB().then(b => {
console.log(`result: ${a + b}`);
console.timeEnd('get sum');
})
});
Среда исполнения JS уже умеет параллельно?
let money, price,
let money,
price;
Есть ли что-то типо delegate() для такого случая?
const days = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
// или
const days = Array.from({ length: 7 }, (_, i) => new Date(1, 0, i)
.toLocaleString('ru', { weekday: 'long' })
.replace(/./, m => m.toUpperCase()
));
for (
let iDay = 0;
confirm(`${days[iDay]}. Хотите увидеть следующий день?`);
iDay = (iDay + 1) % days.length
) ;
сделал это так, но мне кажется, это не совсем производительно и есть решение получше
const lastId = arr.reduce((id, n) => n.glob_id || id, null);
// или
const lastId = (arr.filter(n => n.glob_id).pop() || {}).glob_id;
// или
const lastId = ([...arr].reverse().find(n => n.glob_id) || {}).glob_id;
// или
const lastId = arr.map(n => n.glob_id).filter(Boolean).pop();
let lastId = null;
for (let i = arr.length; i--;) {
if (arr[i].glob_id) {
lastId = arr[i].glob_id;
break;
}
}
const lastId = arr.findLast(n => n.glob_id)?.glob_id;
const parentSelector = 'div';
const childSelector = 'p';
const className = 'there';
const siblingsSelector = `${parentSelector} > ${childSelector}`;
const elementSelector = `${siblingsSelector}.${className}`;
const index = Array.prototype.findIndex.call(
document.querySelectorAll(siblingsSelector),
n => n.classList.contains(className)
);
let index = -1;
for (
let el = document.querySelector(elementSelector);
el;
index++, el = el.previousElementSibling
) ;
const el = document.querySelector(elementSelector);
const index = el ? [...el.parentNode.children].indexOf(el) : -1;
childSelector
, и они не должны учитываться, то третий вариант не подходит, а во втором надо заменить index++
на index += el.matches(childSelector)
. document.addEventListener('keypress', function(e) {
if (e.keyCode === 32) {
console.log('space pressed');
}
});
document.addEventListener('wheel', function(e) {
const event = new Event('keypress');
event.keyCode = 32;
document.dispatchEvent(event);
});
const selector = 'div p';
const removeFirst = 5;
const removeLast = 3;
document.querySelectorAll(selector).forEach((n, i, a) => {
if (i < removeFirst || i > a.length - removeLast - 1) {
n.remove();
}
});
document.querySelectorAll([
`${selector}:nth-child(-n+${removeFirst})`,
`${selector}:nth-last-child(-n+${removeLast})`,
]).forEach(n => n.replaceWith());
<div class="counter">
<button class="minus">-</button>
<input type="number" min="2" max="17" value="5">
<button class="plus">+</button>
</div>
const updateInput = change => e =>
$('input', e.delegateTarget).val(function(i, v) {
const min = this.min || -Infinity;
const max = this.max || Infinity;
return Math.max(min, Math.min(max, (v | 0) + change));
});
$('.counter')
.on('click', '.minus', updateInput(-1))
.on('click', '.plus', updateInput(1))
.on('input', updateInput(0));
const updateInput = change => e => {
const input = e.target.closest('.counter').querySelector('input');
const min = input.min || -Infinity;
const max = input.max || Infinity;
input.value = Math.min(max, Math.max(min, (input.value | 0) + change));
};
document.querySelectorAll('.counter').forEach(function(n) {
n.querySelector('.minus').addEventListener('click', this[0]);
n.querySelector('input').addEventListener('input', this[1]);
n.querySelector('.plus').addEventListener('click', this[2]);
}, [ -1, 0, 1 ].map(updateInput));
document.addEventListener('click', ({ target: t }) => {
const change = -t.matches('.plus') || +t.matches('.minus');
if (change) {
const input = t.closest('.counter').querySelector('input');
input.value -= change;
input.dispatchEvent(new Event('input', { bubbles: true }));
}
});
document.addEventListener('input', ({ target: t }) => {
if (t.closest('.counter')) {
t.value = Math.min(t.max || Infinity, Math.max(t.min || -Infinity, t.value | 0));
}
});
<button class="minus" data-change="-1">-</button>
<button class="plus" data-change="+1">+</button>
document.addEventListener('input', updateInput);
document.addEventListener('click', updateInput);
function updateInput({ target: t }) {
const counter = t.closest('.counter');
if (counter) {
const input = counter.querySelector('input');
const min = input.min || -Infinity;
const max = input.max || Infinity;
input.value = Math.min(max, Math.max(min, (input.value | 0) + (t.dataset.change | 0)));
}
}
position = anchor.position().top;
position = anchor.position().top + $('#container').scrollTop();
:visible
. Вот с его помощью и отбирайте следующее изображение, например так.:visible
лучше использовать его (в примере по ссылке выше можно просто заменить одно на другое). const buttonSelector = 'button';
const getButtons = () => document.querySelectorAll(buttonSelector);
document.addEventListener('click', ({ target: t }) => {
if (t.closest(buttonSelector)) {
const buttons = getButtons();
const html = Array.from(buttons, n => n.innerHTML);
for (const [ i, n ] of buttons.entries()) {
n.innerHTML = html[~-(i || html.length)];
}
}
});
const buttons = getButtons();
const onClick = () =>
buttons.forEach(function(n, i, a) {
n.append(...(++i < a.length ? a[i].childNodes : this));
}, [...buttons[0].childNodes]);
buttons.forEach(n => n.addEventListener('click', onClick));
const el = document.querySelector('.line');
.el.removeChild(el.childNodes[2]);
// или
el.querySelector('input').nextSibling.remove();
// или
el.lastChild.replaceWith();
// или
el.innerHTML = el.innerHTML.replace(/(>)[\s\S]+/, '$1');
// или
el.innerHTML = el.innerHTML.slice(0, -~el.innerHTML.indexOf('>'));
const $headers = $('.bf-attr-group-header');
$headers.each(i => $headers
.eq(i)
.nextUntil($headers.get(i + 1))
.wrapAll('<div class="wrapper">')
);
document.querySelectorAll('.bf-attr-group-header').forEach((n, i, a) => {
const wrapper = document.createElement('div');
const elems = [];
for (let el = n; (el = el.nextElementSibling) && el !== a[i + 1]; elems.push(el)) ;
wrapper.append(...elems);
wrapper.classList.add('wrapper');
n.after(wrapper);
});
const buttons = document.querySelectorAll('кнопки ваши - вам и виднее, каким должен быть селектор');
for (const n of buttons) {
let clicks = 0;
n.onclick = () => n.innerText = 'clicked: '.concat(++clicks);
}
buttons.forEach(function(n) {
n.addEventListener('click', this);
}, ({ currentTarget: t }) => {
t.textContent = `clicked: ${t.dataset.clicks = -~t.dataset.clicks}`;
});
$('span').text((i, text) => {
return ~'+-'.indexOf(text.charAt()) ? text : `+${text}`;
});
for (const n of document.getElementsByTagName('span')) {
n.innerText = '+'.slice('+-'.includes(n.innerText[0])) + n.innerText;
}
document.querySelectorAll('span').forEach(n => {
n.textContent = n.textContent.replace(/^(?![+-])/, '+');
});
[...new Set(arr)]
.Object.values(arr.reduce((acc, n) => (acc[n] = n, acc), {}))
// или
Array.from(new Map(arr.map(n => [ n, n ])).values())
// или
arr.filter(function(n) {
return !(this[n] = this.hasOwnProperty(n));
}, {})
// или
arr.filter(((picked, n) => !picked.set(n, picked.has(n)).get(n)).bind(null, new Map))
// или
arr.filter((n, i, a) => i === a.indexOf(n))
// или
arr.reduce((acc, n) => (acc.includes(n) || acc.push(n), acc), [])