@danilr

Как повторить данный код при ошибке запроса?

Запрос отправляется в created(), далее при получении ответа в mounted() он выполняет необходимые действия при успешном ответе - вопрос в том, как мне повторить запрос и проделать те же действия при неудачном запросе? Подскажите как это сделать?
created(){
    this.dataRequest = this.getAllData()
  },
	mounted() {
		this.markers = DG.featureGroup();
		this.popups = DG.featureGroup();

		this.map = DG.map("map", {
			center: [54.98, 82.89],
			zoom: 9,
			minZoom: 7,
			zoomControl: false,
			fullscreenControl: false
    });
    
      this.dataRequest.then(response => {
        this.filter() // для планировок экшен
        this.setMarkers(this.residentials)
        
        this.map.on("zoomstart", this.onZoomStart);
        this.map.on("zoomend", this.onZoomEnd);
        
			})
			.catch(error => {
        console.log(error);
      });

	},
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
Сделайте отдельный метод типа fetchData(). Вызывайте его в mounted.

fetchData() {
  this.dataRequest.then(response => {
        this.filter() // для планировок экшен
        this.setMarkers(this.residentials)
        this.map.on("zoomstart", this.onZoomStart);
        this.map.on("zoomend", this.onZoomEnd);
        
      })
      .catch(error => {
        this.fetchData();
      });
}


Но по-хорошему бы:
1. Разбить это на большее число методов, выделив работу с картой в отдельный метод от получения данных
2. fetchData в catch запускать через timeout
3. В catch надо бы определять, что проблема именно сети, а не другая: ни ошибка с сервера, ни какая-то на клиентской стороне. Не знаю, чем и как вы шлёте запросы, по этому не могу сразу код предложить.

На ES по-старше будет чуть красивее:

mounted() {
    this.markers = DG.featureGroup();
    this.popups = DG.featureGroup();

    this.map = DG.map("map", {
      center: [54.98, 82.89],
      zoom: 9,
      minZoom: 7,
      zoomControl: false,
      fullscreenControl: false
    });
    
    await fetchData();
    this.setMapMarkets();
  },
  methods: {
    setMapMarkers() {
        this.filter() // для планировок экшен
        this.setMarkers(this.residentials)
        this.map.on("zoomstart", this.onZoomStart);
        this.map.on("zoomend", this.onZoomEnd);
    },
   
    async fetchData() {
        try {
            const response = await this.dataRequest();
            // как-то надо использовать response, но у вас нет использования
        } catch (e) {
            // if ошибка сети
           await this.fetchData()
        }
    }
  }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
e_snegirev
@e_snegirev
https://habr.com/ru/post/227225/
написать или взять откуда нибудь что-то вроде этого
Ответ написан
Ваш ответ на вопрос

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

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