Избегайте повторения одного и того же кода в «then» и «catch» - PullRequest
2 голосов
/ 24 апреля 2020

Есть ли опция, позволяющая избежать повторения this.$router.go() в приведенном ниже коде и выполнить фрагмент кода независимо от результата?

await axios.put(`/user/` + this.data.id, this.user)
  .then((response) => {
    this.$router.go();
  })
  .catch((error) => {
    this.$router.go();
  });

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Вы можете использовать метод обещания finally:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

1 голос
/ 24 апреля 2020

... и запустить фрагмент кода, какой бы ни был результат?

В Ax ios вы можете сделать это согласно официальным документам

axios.get('url')
  .then(function (response) {
    // handle success
  })
  .catch(function (error) {
    // handle error
  })
  .then(function () {
    // always executed
    this.$router.go();
  });

Обновление: отмечено после комментария @CertainPerformance

Ax ios теперь поддерживает finally (проверьте по примерам)

1 голос
/ 24 апреля 2020

Вы можете поместить его в именованную функцию раньше времени:

const handle = () => {
  this.$router.go();
};
await axios.put(`/user/` + this.data.id, this.user)
  .then(handle)
  .catch(handle);

Вы также можете использовать .finally, если Ax ios поддерживает это, это немного новый, но проблема с .finally заключается в том, что Обещание «пройдет» через .finally, поэтому, хотя вы сможете звонить this.$router.go без повторения, если вызов axios отклонится, вы в конечном итоге с отклоненным обещанием. поэтому вам нужно будет .catch впоследствии, чтобы избежать броска await:

await axios.put(`/user/` + this.data.id, this.user)
  .finally(() => {
    this.$router.go();
  })
  .catch(() => {});
0 голосов
/ 27 апреля 2020

То, что вы на самом деле имеете в виду, это:

await axios.put(`/user/` + this.data.id, this.user)
  .then((response) => {
    this.$router.go();
  },(error) => {
    this.$router.go();
  });

, потому что единственное различие между написанным вами кодом и этим: если this.$router.go() выдает ошибку, то снова вызовите this.$router.go(). В этом нет особого смысла.

И поскольку вас не волнует response, вы также можете написать:

await axios.put(`/user/` + this.data.id, this.user)
  .catch(() => {})
  .then(() => {
    this.$router.go();
  });

или лучше (IMO)

await axios.put(`/user/` + this.data.id, this.user).catch(noop);

this.$router.go();

при условии, что вы определили function noop(){} где-то еще для дальнейшего использования.

Даже если говорят, что вы не должны смешивать promise.then() и await, я предпочитаю это более

try {
  await axios.put(`/user/` + this.data.id, this.user);
} catch (error) {}

this.$router.go();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...