Функция увеличивает зарплату, и в случае ошибки отправляется уведомление администратору?

Ваша функция не проходит одну из проверок. Убедитесь, что она соответствует следующим требованиям:

1. Функция должна возвращать промис (5ms) - проверка пройдена.
2. Функция должна корректно увеличивать зарплату сотрудника с наименьшей зарплатой (3ms) - проверка пройдена.
3. Функция должна отправлять уведомление сотруднику - проверка пройдена.
4. В случае ошибки при увеличении зарплаты функция должна отправлять уведомление администратору, но не уведомлять пользователя (3ms) - проверка не пройдена.

Вас интересует, каким образом можно исправить функционал функции, чтобы она удовлетворяла всем указанным требованиям?
  • 20 сентября 2024 г. 14:53
Ответы на вопрос 2
Для того чтобы функция соблюдала все требования, необходимо внести изменения в обработку ошибок. Давайте разработаем пример функции на JavaScript, которая соответствует вашим критериям:

```javascript
function increaseSalary(employees) {
    return new Promise((resolve, reject) => {
        try {
            // Находим сотрудника с наименьшей зарплатой
            const employeeWithLowestSalary = employees.reduce((prev, current) => {
                return (prev.salary < current.salary) ? prev : current;
            });

            // Увеличиваем зарплату сотрудника
            employeeWithLowestSalary.salary += 1000; // Пример увеличения

            // Уведомляем сотрудника
            notifyEmployee(employeeWithLowestSalary)
                .then(() => {
                    // Успешно уведомили пользователя
                    resolve(employeeWithLowestSalary);
                })
                .catch((error) => {
                    reject(error);
                });

        } catch (error) {
            // Отправляем уведомление администратору в случае ошибки
            notifyAdmin(error)
                .then(() => {
                    // Ошибка обработана, но пользователь не уведомляется
                    resolve(null); // Успешно завершили функцию, хотя произошла ошибка
                })
                .catch((adminError) => {
                    // Здесь можно обрабатывать ошибки отправки уведомления администратору
                    reject(adminError);
                });
        }
    });
}

function notifyEmployee(employee) {
    return new Promise((resolve, reject) => {
        // Логика уведомления сотрудника
        console.log(`Уведомление отправлено сотруднику: ${employee.name}`);
        resolve();
    });
}

function notifyAdmin(error) {
    return new Promise((resolve, reject) => {
        // Логика уведомления администратора
        console.error(`Ошибка: ${error.message}`);
        resolve();
    });
}
```

### Объяснение:

1. **Промисы**: Функция `increaseSalary` возвращает промис, который обрабатывает как успешное увеличение зарплаты, так и ошибки.
  
2. **Увеличение зарплаты**: Используется метод `reduce` для нахождения сотрудника с наименьшей зарплатой, и зарплата увеличивается.

3. **Уведомление сотрудника**: После успешного изменения зарплаты вызывается функция `notifyEmployee`, которая уведомляет сотрудника.

4. **Обработка ошибок**: В блоке `catch` обрабатываются ошибки. При возникновении ошибки отправляется уведомление администратору с помощью функции `notifyAdmin`, и пользователь не получает уведомления.

Таким образом, функция удовлетворяет всем предложенным требованиям.
Не проще отделить шаг уведомления сотрудника и отправлять его только в случае успешного завершения всех предыдущих операций? <br/> <br/> <pre><code class="javascript">function increaseSalary() {
  return api.getEmployees()
    .then(employeeData =&gt; {
      const [minSalaryEmployee] = employeeData.reduce(([minEmployee, minSalary], employee) =&gt; {
        const { salary } = employee;
        return (salary &lt; minSalary
          ? [employee, salary]
          : [minEmployee, minSalary]
        );
      }, [null, Infinity]);
      const { id, salary: oldSalary } = minSalaryEmployee;
      const newSalary = oldSalary * 1.2;
      return { id, salary: newSalary };
    })
    .then(({ id, salary }) =&gt; api.setEmployeeSalary(id, salary)
      .then(updatedEmployee =&gt; {
        return api.notifyEmployee(updatedEmployee.id, `Hello, ${updatedEmployee.name}! Congratulations, your new salary is ${salary}!`);
      })
    )
    .catch(e =&gt; {
      return api.notifyAdmin(e);
    });
}</code></pre>
Похожие вопросы