Как завершить выполнение функции при catch?

#javascript #vue.js #axios

#javascript #vue.js #axios

Вопрос:

Как завершить выполнение функции при catch? Я предполагаю, что return следует поместить туда, куда я его поместил ( .catch( error => {console.log(error);} return) ), но это не работает. Подскажите, как это сделать правильно?

     getCustomers: function () {
            let url = '/crm/customer/';

            axios.get(url).then((response) => {
                this.customers = response.data.results;
                if (this.customers.length === 100) {
                    for (let i = 2; i < 100; i  ) {
                        axios.get('/crm/customer/?page='   i).then((response) => {
                            this.c = response.data.results;
                            for (let item of this.c.values()) {
                                this.customers.push(item);
                            }
                        }).catch( global_waiting_stop());

                    }
                }
            }).catch( error => { console.log(error); })
            .finally(() => (global_waiting_stop()));
        },
  

Комментарии:

1. Если я правильно понял ваш вопрос, вы хотите, чтобы в случае сбоя второго axios просто завершили работу? затем оберните их в Promise. все и связать это

2. @AniketJha прошу прощения, но как это сделать? Я новичок

3. @AniketJha — Обещание. все равно все они будут выполняться одновременно. Ему нужно было бы преобразовать ее в асинхронную функцию и ожидать каждого вызова …. но 97 вызовов ajax подряд .. это заняло бы действительно много времени. Наверняка в API есть какой-то механизм подкачки, чтобы они не догадывались об этом полностью.

4. @Iwrestledabearonce. Возможно ли каким-то образом заранее узнать, сколько страниц может быть получено? Я делаю все это только для того, чтобы получить данные со всех страниц, я ставлю 100 с запасом, так как будут добавлены новые

5. @Iwrestledabearonce. прежде всего, ваше имя пользователя потрясающее. И да, обещаю. все будут выполнять множество сетевых вызовов одновременно, и да, на уровне API должен быть какой-то механизм разбивки на страницы для ограничения вызова. Я бы запустил вызов API страницы, дождавшись данных, а затем отправил новый вызов. Экзо, действительно ли требуется иметь данные страницы в самой точке?

Ответ №1:

finally() выполняется как после then , так и catch функций. Если вы не хотите, чтобы она запускалась, переместите свой global_waiting_stop в нижнюю часть then блока вместо этого и избавьтесь от finally .

 getCustomers: function() {
  let url = '/crm/customer/';
  axios.get(url).then((response) => {
    this.customers = response.data.results;
    if (this.customers.length === 100) {
      for (let i = 2; i < 100; i  ) {
        axios.get('/crm/customer/?page='   i).then((response) => {
            this.c = response.data.results;
            for (let item of this.c.values()) {
              this.customers.push(item);
            }
          }).catch(error => {
              console.log(error);
            }
            return)
          .finally(() => (global_waiting_stop()));
      }
    }
    global_waiting_stop();
  }).catch(error => {
    console.log(error);
  })
},
  

Комментарии:

1. Я хочу, чтобы вся функция завершалась при сбое get (second). Мне нужно это сделать? Я обновил вопрос

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

Ответ №2:

попробуйте приведенный ниже код:

 getCustomers: function() {
    let url = '/crm/customer/';
    return axios.get(url).then((response) => {
       this.customers = response.data.results;
       if (this.customers.length === 100) {
          for (let i = 2; i < 100; i  ) {
            return axios.get('/crm/customer/?page='   i).then((response) => {
              this.c = response.data.results;
                for (let item of this.c.values()) {
                  this.customers.push(item);
                }
              }).catch(error => {
                  console.log(error);
                  return false;
              })
          }
        }
     }).catch(error => {
     console.log(error);
     return false;
   })
},
  

Комментарии:

1. for не запускается во второй раз, хотя на странице 3 у меня есть данные:(

2. IDE говорит мне, что оператор ‘for’ не выполняет цикл»