let retryCount = 0;
const retryMax = 3;
const url = 'https://example.com/api/method';
const getData = () => {
$.get(url, data => {
// ...
}).fail(() => {
if (++retryCount <= retryMax) {
setTimeout(getData, 1000); // через секунду
} else {
console.error('Так и не получилось');
}
});
};
getData();
switch (Model[i].Type) {
case EventType.Call:
className = 'my-class-call';
break;
case EventType.Meeting:
className = 'my-class-meeting';
break;
// ...
}
<a class="@className" id="user-event-@i" href="@Url.Action("Details", "Event", new { @id = @Model[i].Id })">
<div style="width: 100%; min-height: 110px; border-top: 2px solid #CFCED1; border-left: 1px solid #CFCED1; border-right: 1px solid #CFCED1; background-color: @backgroundColor; cursor: pointer;">
</div>
</a>
.my-class-call { ... }
.my-class-call:hover { ... }
.my-class-meeting { ... }
.my-class-meeting:hover { ... }
{ Progger: 100, Tester: 200 }
const calculateTeamFinanceReport = (salaries, team) => {
const bySpec = team.reduce((acc, { specialization: spec }) => {
if (!Object.hasOwn(acc, spec)) acc[spec] = 0;
const { salary, tax } = salaries[spec];
const k = 1 + parseFloat(tax) / 100;
acc[spec] += salary * k;
return acc;
}, {});
const totalBudgetTeam = Object.values(bySpec).reduce((acc, c) => acc + c);
const result = Object.fromEntries(Object.entries(bySpec).map(([key, value]) => ['totalBudget' + key, value]));
return { totalBudgetTeam, ...result };
};
calculateTeamFinanceReport(salaries, team);
// { totalBudgetTeam: 3350, totalBudgetProgger: 1150, totalBudgetTester: 2200 }
Для разбора процентов удобна функция parseFloat()
– она читает цифры с начала строки, сколько может. И игнорирует буквы после. parseFloat('15.5%') === 15.5
const arrayOfObjects = [
{ student: 'Dmitriy', runLab () {return 1;}},
{ student: 'Andrew', runLab () {return 2;}},
{ student: 'Mellisa', runLab () {return 3;}},
{ student: 'Ann', XrunLab () {return 4;}},
];
function gradeLabs(labs, expectedResult = 1) {
labs.forEach(({ student, runLab }) => {
try {
const result = runLab();
if (result === expectedResult) {
console.log('Student %s has PASSED the test', student);
} else {
console.error('Student %s has FAILED the test', student);
}
} catch (e) {
console.error('Student: %s has FAILED the test. Error thrown: %o', student, e);
}
});
}
gradeLabs(arrayOfObjects, 1);
90
, а сейчас актуальная 109
, по умолчанию пробует в первую очередь протокол HTTPS (источник новости)arr
нужна только внутри цикла, лучше её туда и поместить. В большом коде проще будет разобраться, когда ограничена область видимости созданных переменных. const
вместо let
уместнее, т.к. внутри цикла значение key
не меняется, да и arr
тоже:for (const key in a14) {
const arr = a14[key];
// ...
}
.join(' ')
– это избавляет от проблемы лишнего пробела, да и innerHTML
лучше innerText
, т.к. выводимое не содержит разметки, и зачем заставлять браузер пытаться разбирать его как HTML.- document.querySelector('.b-14').onclick = f14;
+ document.querySelector('.b-14').addEventListener('click', f14);
a14
, то может, слышали про Object.values().const f14 = () => document.querySelector('.out-14') // элемент для вывода результата
.innerText = Object.values(a14) // массив массивов [ [1, 2, 23], [3, 4, 5], ... ]
.map(arr => arr[0]) // вместо каждого под-массива, его первый элемент
.join(' '); // склеить в строку через пробел
src
загрузят картинку один единственный раз и покажут в трёх местах.src
загрузят три разные картинки. HTTP/1.1
, то 3 картинки это 3 разных запроса. Для каждого устанавливается новое соединение. Скачивание идёт параллельно.HTTP/2
, то соединение одно, и 3 запроса выстроятся последовательно. Экономия на установлении новых соединений.HTTP/2
должен быть быстрее за счёт экономии на времени установления новых соединений.random(6)
возвращает целое: 1, 2, 3, 4, 5 или 6 – с равной вероятностью.(1 + 1 + 1 + 1 + 1 + 1) / 6 == 1
1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6 = 1 / 6^6 = 0,00002143347051
= 2 тысячные процента. Всего ничего. [[1, 2, 3],[4, 5, 6],[7, 8, 9]].map(arr => arr.reduce((acc, c) => acc + c))
// [ 6, 15, 24 ]
[
[1, 2, 3] --> 6
[4, 5, 6] --> 15
[7, 8, 9] --> 24
]
— это операция map(): каждый-в-каждый.reduce( (accumulator, current) => accumulator + current )
reduce(
function(accumulator, current) {
return accumulator + current;
}
)
key
. key
. Нужно что-то уникальное, характерное для каждого элемента массива, что не изменится при изменении порядка, скажем.arr.map(el => <TimerComponent name={el} key={el} />)
Ну и массивы в стейте, помните, надо не мутировать, а заменять массив целиком на новый.**
выше остатка от деления %
,3**2 == 9
, уже потом деление по модулю на 7 (остаток == 2)