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

Задана функция и по умолчанию имитируется неудачный запрос

// Функция имитирует неудачный запрос за картинкой
function fetchAvatarImage(userId) {
  return new Promise((resolve, reject) => {
    reject(new Error(`Error while fetching image for user with id ${userId}`));
  });
}

export async function getAvatarUrl(userId) {
  const image = await fetchAvatarImage(userId);
  return image.url;
}

Тестом вызывается функция

test('getAvatarUrl', async () => {
  await expect(getAvatarUrl(1)).resolves.toBe('/images/default.jpg');
});

Подскажите, что должно добавиться, чтобы асинхронная функция getAvatarUrl возвращала дефолтную картинку пользователя, а не выбрасывала исключение.


Ответы (1 шт):

Автор решения: EzioMercer

Нужно просто добавить catch и из него вернуть объект:

{
  url: '/images/default.jpg'
}

(async() => {
  function fetchAvatarImage(userId) {
    return new Promise((resolve, reject) => {
      reject(new Error(`Error while fetching image for user with id ${userId}`));
    });
  }

  async function getAvatarUrl(userId) {
    const image = await fetchAvatarImage(userId).catch(e => ({
      url: '/images/default.jpg'
    }));
    return image.url;
  }

  console.log(await getAvatarUrl(1));
})()

Ну или использовать синтаксис try..catch:

(async() => {
  function fetchAvatarImage(userId) {
    return new Promise((resolve, reject) => {
      reject(new Error(`Error while fetching image for user with id ${userId}`));
    });
  }

  async function getAvatarUrl(userId) {
    try {
      const image = await fetchAvatarImage(userId);
      
      return image.url;
    } catch (e) {
      return '/images/default.jpg'
    }
  }

  console.log(await getAvatarUrl(1));
})()

→ Ссылка