@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 Просьба не бомбить на код, я ученик

Помогите, пожалуйста решить задачу.
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы