@justedoit

Обработка кол-ва ошибок, как лучше реализовать?

Здравствуйте. Помогите добить последнее условие в задаче.

Есть следующая задача:
нужно написать функцию, которая

  1. Получает данные по всем работникам
  2. Считаем среднее-арифметическое по ЗП
  3. Тем сотрудникам, у которых ЗП меньше средней - повышаем на 20%, у кого больше - на 10%
  4. Если запрос прошел успешно - отправлять сотруднику уведомление об увеличении ЗП тектом: Hello, <имя>! Congratulations, your new salary is <новая ЗП>!
  5. Если запрос завершился неудачей - отправлять данные ошибки администратору
  6. По итогу отправить суммарное ЗП работников в бухгалтерию

Должна всегда возвращать resolved промис с числовым значением, сколько зарплат успешно повышено.

Все функции для получения/изменения данных асинхронны и возвращают промисы.
Вам предоставлены функции:

api.getEmployees(); // Возвращает массив с объектами {id: 343, name: 'Alex', salary: 20000}
api.setEmployeeSalary(employeeId, newSalary); // Принимает id сотрудника и новую зарплату. Возвращает новые данные по сотруднику.
api.notifyEmployee(employeeId, text); // Принимает id сотрудника и текст уведомления
api.notifyAdmin(error); // Принимает ошибку
api.sendBudgetToAccounting(summarySalaries); // Принимает суммарную ЗП

Вот весь код
const api = {
  _employees: [
    { id: 1, name: 'Alex', salary: 120000 },
    { id: 2, name: 'Fred', salary: 110000 },
    { id: 3, name: 'Bob', salary: 80000 },
  ],

  getEmployees() {
    return new Promise((resolve) => {
      resolve(this._employees.slice());
    });
  },

  setEmployeeSalary(employeeId, newSalary) {
    return new Promise((resolve) => {
      const updatedEmployees = this._employees.map((employee) =>
        employee.id !== employeeId
          ? employee
          : {
            ...employee,
            salary: newSalary,
          }
      );
      this._employees = updatedEmployees;
      resolve(this._employees.find(({ id }) => id === employeeId));
    });
  },

  notifyEmployee(employeeId, text) {
    return new Promise((resolve) => {
      resolve(true);
    });
  },

  notifyAdmin(error) {
    return new Promise((resolve) => {
      resolve();
    });
  },

  setEmployees(newEmployees) {
    return new Promise((resolve) => {
      this._employees = newEmployees;
      resolve();
    });
  },

  sendBudgetToAccounting(newBudget) {
    return new Promise((resolve) => {
      resolve();
    });
  },
};

const getMiddleSalary = (data) => {
  return data.reduce((a, c) => {
    a += c.salary / data.length
    return Math.floor(a);
  }, 0)
}

const salaryIncrease = (middle, data) => {
  const result = data.map((elem) => {
    if (elem.salary < middle) {
      elem.salary *= 1.2
    } else {
      elem.salary *= 1.1
    }
    return elem;
  })
  return result;
}

const handleEmployeeSalary = async (data) => {
  const middle = getMiddleSalary(data);
  console.log(middle)
  const salaryInc = salaryIncrease(middle, data);
  const arr = [];
  for (let { id, salary } of salaryInc) {
    arr.push(await api.setEmployeeSalary(id, salary))
  }
  return arr;
}

const notifyEmployee = ({ id, salary, name }) => {
  return api.notifyEmployee(id, `Hello, ${name}! Congratulations, your new salary is ${salary}!`)
}

const sendBudgetToAccounting = ({ salary }) => {
  return api.sendBudgetToAccounting(salary);
}

const notifyAdmin = (error) => {
    return api.notifyAdmin(error);
}

async function increaseSalary() {
  try {
    const data = await api.getEmployees();
    const newData = await handleEmployeeSalary(data);
    newData.forEach((data) => notifyEmployee(data));
    const result = await api.sendBudgetToAccounting(
        newData.reduce((res, c) => {
        res += c['salary']
        return res
    } ,0)).then(()=> data.length)
    return result;
  } catch (error) {
    await notifyAdmin(error)
  }
}


Тест
функция должна возвращать промис (21ms)
✓ должна корректно увеличивать ЗП всем сотрудникам и отправлять бюджет (12ms)
✓ должна отправлять уведомление сотрудникам (10ms)
✕ в случае ошибки увеличения ЗП должна отправлять уведомление администратору, но не пользователю (10ms)


P.S Просьба не бомбить на код, я ученик

Помогите, пожалуйста решить задачу.
  • Вопрос задан
  • 1643 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Oureap
async function increaseSalary() {	
	//кол-во успешных запросов
	let countInquiry = 0;
	//бюджет
	let newBudget = 0;

	//список сотрудников
	const employeesList = await api.getEmployees();	
	//средняя ЗП
	const averageSalaries = 
        Math.floor((employeesList.reduce((acc, el) => acc += el.salary, 0)) / employeesList.length);	

	try {
		//перебираем сотрудников из списка
		for (employee of employeesList) {
			//повышенная ЗП
			let changedSalary = 0;
			
			const sendRequestSalary = async () => {
				try {
					//запрос на увеличение ЗП 
					await api.setEmployeeSalary(employee.id, changedSalary);
					//текст для сотрудника
					/* const changedEmployeeList = api.getEmployees();
					console.log(changedEmployeeList) */
					let text = 
                                        `Hello, ${employee.name}! Congratulations, your new salary is ${changedSalary}!`;
					//отправка сообщения сотруднику
					await api.notifyEmployee(employee.id, text);
					//фиксация успешных запросов
					countInquiry++;
					//формирование бюджета
					newBudget += changedSalary;
				} catch (error) {
					//сообщение администратору об ошибке
					await api.notifyAdmin(error);
				}
			}
			//расчет повышения ЗП, согласно условиям
			if (employee.salary > averageSalaries) {
				changedSalary = parseInt(employee.salary * 1.1);
				console.log(changedSalary)
				await sendRequestSalary();
			} else if (employee.salary < averageSalaries) {
				changedSalary = parseInt(employee.salary * 1.2);
				await sendRequestSalary();
			} 
		}

	} catch (error) {
		//сообщение администратору об ошибке
		await api.notifyAdmin(error);

	} finally {
		//отправка бюджета в бухгалтерию
		await api.sendBudgetToAccounting(newBudget);		
	}

	//возвращаем кол-во успешных операций увеличения ЗП
	return countInquiry;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
04 мая 2024, в 06:10
4000 руб./за проект
04 мая 2024, в 05:49
10000 руб./за проект
04 мая 2024, в 03:57
10000 руб./за проект