Либо я чего-то не понимаюНе понимаете значение слова асинхронный
console.log
отрабатывает раньше любого errorsOnLines.push
Как написать это с помощью промисов и async/await, я знаю. А как написать это без промисов, с обычным коллбэком? До изобретения промисов как-то ведь писали такое...у api тоже может быть колбэк, который можно вызвать когда будет готов результат операции
const api = (cb) => {
fs.readFile(fileName, (err, content) => {
if (err) {
cb("none")
} else {
cb(content)
}
})
// return не нужен
}
Подскажите пожалуйста, стоит ли явно определять тип переменной или нет?В большинстве случаев нет, лучше доверится выводу типов, он сделает это лучше.
есть, так как ts знает, что const нельзя переприсвоить, а числа неизменяемый тип, он выведет тут литеральный тип 10, который без проблем можно передать как в number так и в union из литеральных типов содержащий в себе 10const a: number = 10;
Есть ли вообще какие то отличия?
// где-то есть
type SomeObject = { /* ... */ };
function getSomeObject(): SomeObject { /* ... */ }
// без явной декларации будет выведен тип null
let v: SomeObject | null = null;
setTimeout(() => {
// без явной декларации типа для v здесь будет ошибка
v = getSomeObject();
});
n % 10
const lastDigit = n => {
// в n совсем не то
if (isNaN(n) || !isFinite(n)) return NaN;
// в n целое
if (n % 1 === 0) return n % 10;
// для дробных проще со строкой работать
const s = String(Math.abs(n));
// неточные значения
if (s.length > 16 || s.includes('e')) return NaN;
return +s.slice(-1);
}
type EventData = {
event: Parameters<typeof thumbHandler>[0];
};
const handleThumbEnd = (eventData: EventData) => thumbHandler(eventData.event, true);
const handleThumbMove = useThrottledFn(
(eventData: EventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так:type HandlerMove = Parameters<typeof useSwipeable>[0]['onSwiping'];
type HandlerEnd = Parameters<typeof useSwipeable>[0]['onSwiped'];
const handleThumbEnd: HandlerMove = (eventData) => thumbHandler(eventData.event, true);
const handleThumbMove: HandlerEnd = useThrottledFn(
(eventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так const f = i => {
console.log(i);
};
for (let i = 0; i < 5; i++) {
setTimeout(f, 1000, i);
}
mutation observer ловит изменения, делает проверку и заполняет массив потоми делает запрос. Но тут почему то ajax не ждёт пока заполнится массив и сразу выполняет запрос.К тому же эту проблему синхронный запрос не решит, он ее наоборот усугубит, так как MutationObserver так же не сможет отработать пока не завершится запрос.
Существуют ли случаи, когда оправдано использование синхронных запросовединственное оправданное применение - отправка данных перед закрытием вкладки на динозаврах без поддержки sendBeacon
логика хромает и лучше всего все переписатьк сожалению появление асинхронности в одном месте может привести к появлению асинхронности во многих других местах, по другому ни как. Так что да, придется переписать. Но это неизбежно, так как многие api в современно браузере (тот же MutationObserver) работают только асинхронно. К счастью есть промисы и async/await сахар над ними, что сильно упрощает такую задачу.
const OBJECT = {
fields: {
NAME: 'LOREM',
SECOND_NAME: 'IPSUM',
LAST_NAME: 'DOLOR',
}
};
const url = new URL('https://somesite.com/crm.contact.add.json');
for (const [name, value] of Object.entries(OBJECT.fields)) {
url.searchParams.append(`fields[${name}]`, value);
}
console.log(url.href);
type CreatureBasis = {
People: {
child: {
age: number;
school: string;
};
adult: {
age: number;
height: number;
weight: number;
};
};
Animal: {
fish: {
waterBody: string;
};
cat: {
catchMouses: boolean;
};
};
};
type Creature = {
[K0 in keyof CreatureBasis]: {
[K1 in keyof CreatureBasis[K0]]: {
type: K0;
subtype: K1;
params: CreatureBasis[K0][K1];
};
}[keyof CreatureBasis[K0]];
}[keyof CreatureBasis];