Задать вопрос
@karpo518

Как поставить редирект в промисе?

API возвращает разные типы ошибок. При получении некоторых ошибок требуется перенаправить пользователя на другую страницу. Проблема в том, что у всех запросов на проекте есть обработчики в компонентах, которые обрабатывают как успешный, так и неуспешный ответ API. Если не прервать обработку промиса перед редиректом, то в результате до редиректа случится бесполезная перерисовка компонентов. Также в некоторых случаях возникает конфликты обновления сторов, потому при редиректе размонтирование компонента запускает очистку стора, а при отклоненном промисе срабатывает вывод ошибки через стор в том же компоненте.

Можно было бы проверять тип ошибки в каждом компоненте, но хотелось разрулить ситуацию в одном месте, потому что она нужна для всех запросов к API и для всех компонентов. Пока приходит в голову только возвращение из промиса другого зависшего промиса, но это решение выглядит небезопасно.

Как правильно разрешать такую ситуацию?

Ниже предоставляю пример псевдокода для понимания сути проблемы

Пример кода
function sendApiRequest(url, params) {

	return fetch(url)
      .then(response => {
	  if (!response.ok) {
	    throw new Error(`HTTP error! status: ${response.status}`);
	  }
      
      return response.json();
  })
  .then(data => {
    if (!date.success) {
    	if (data.code === 111) {
    		// Здесь нужно прервать выполнение дальнейшего кода,
    		// Чтобы не было дальнейших перерисовок компонентов и конфликтов при обновлении сторов
    		// потому что пользователь будет перенаправлен на другую страницу
    		window.location.replace('#/another-page');
    		return new Promise(() => {});

    	}
    	throw new Error('ApiError');
    }
    console.log(data);
  })
  .catch(error => {
    // Handle any network errors or errors thrown in the then() blocks
    console.error('NetworkError:', error);
  });
	
}
  • Вопрос задан
  • 188 просмотров
Подписаться 3 Средний 6 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
@Kazilsky
Если я так понял то выходит вот такая штука

У тебя в коде есть постоянный промис
Если он вечен, то ты впринципе все так реализовал РАЗВЕ ЧТО
Нужно возвращать data

А если не вечный то типо вот

class RedirectError extends Error {
  constructor(location) {
    super('Redirect');
    this.name = 'RedirectError';
    this.location = location;
  }
}

function sendApiRequest(url, params) {
  return fetch(url)
    .then(r => {
      if (!r.ok) throw new Error(`HTTP error! status: ${r.status}`);
      return r.json();
    })
    .then(data => {
      if (!data.success) {
        if (data.code === 111) {
          throw new RedirectError('#/another-page');
        }
        throw new Error('ApiError');
      }
      return data;
    });
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы