const increaseSalary = async () => {
try {
const employees = await api.getEmployees();
const employee = employees.reduce(
(acc, cur) => (acc.salary > cur.salary ? cur : acc),
{ salary: Infinity },
);
const newSalary = (employee.salary * 1.2) | 0;
const result = await api.setEmployeeSalary(employee.id, newSalary);
if (result.salary !== newSalary) {
throw 'API Error, salary has not increased';
}
await api.notifyEmployee(
employee.id,
`Hello, ${employee.name}! Congratulations, your new salary is ${newSalary}!`,
);
return true;
} catch (e) {
api.notifyAdmin(e.message);
return false;
}
});
const temp = data.reduce(
(acc, cur) => {
acc.bank_props[cur.bank_props.id] = cur.bank_props;
acc.settlements[cur.bank_props.id] = cur.settlements;
return acc;
},
{ bank_props: {}, settlements: {} }
);
const result = {
bank_props: Object.values(temp.bank_props),
settlements: Object.values(temp.settlements),
};
WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.Обычные callback-функции не попадают в очередь, они вызываются в общем стеке. Кроме промисов в приоритетную очередь микрозадач функция может быть добавлена через queueMicrotask(function).
А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?Асинхронные операции выполняются отдельными служебными потоками параллельно с основным стеком. Поэтому сами они не могут заблокировать основной стек. По завершению/таймеру асинхронная операция кладёт функцию в очередь микро- или макрозадач.
{
"status": "error"
"error": {
"form": {
"email": "Пользователь с таким адресом электронной почты уже зарегистрирован",
"password": "Слишком короткий пароль. Минимальная длина 8 символов."
}
}
}
{
"status": "ok"
"location": "/email-verification"
}