Выполнить метод после выполнения всех обещаний внутри данного метода - PullRequest
1 голос
/ 29 мая 2019

В компоненте Vue.js у меня есть несколько методов, которые используют axios для вызова API.

В разных случаях мне нужно выполнить некоторый код после разрешения вызова в этом методе, но я не хочу добавлять группу if операторов в .then(), связанных с вызовом axios.

methods: {
  callApi() {
    axios.get('/api')
     .then(() => {
       // call has resolved, request is done
     })
  },
  firstMethod() {
    this.callApi()
    // Need to wait for the call to resolve
    // Do something
  },
  secondMethod() {
    this.callApi()
    // Need to wait for the call to resolve
    // Do something else
  }
}

Как вы можете видеть, firstMethod и secondMethod оба полагаются на callApi, но должны выполнять разные действия после выполнения запроса. Я предпочитаю разделять эту логику на разные функции вместо использования условий в методе callApi. Есть ли способ сделать это без добавления этой логики внутри callApi?

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

Верните callApi цепочку обещаний, затем используйте и верните ее в firstMethod и secondMethod.

methods: {
  callApi() {
    return axios.get('/api')
     .then(() => {
       // call has resolved, request is done
     })
  },
  firstMethod() {
    return this.callApi()
    .then(() => {
      // Need to wait for the call to resolve
      // Do something
    })
  },
  secondMethod() {
    return this.callApi()
    .then(() => {
      // Need to wait for the call to resolve
      // Do something else
    })
  }
}

Какие бы вызовы callApi, firstMethod или secondMethod не проверяли на наличие ошибок и обрабатывали / сообщали об этом.


Ваш исходный код нарушал одно из правил обещаний: функция всегда должна либо возвращать цепочку, либо обрабатывать отклонение. (И да, это или [99,9% времени], а не и .)

1 голос
/ 29 мая 2019

Цепочка обещаний, поэтому вам нужно взять обещание, которое возвращает Axios, выполнить любую обработку, которая вам может потребоваться, а затем вернуть ее из метода callApi. В других ваших методах, где вы вызываете callApi, вы обрабатываете возвращенное обещание и помещаете любой код, который должен выполняться после ответа API, в функцию-обработчик.

callApi() {
  return axios.get('/api')
   .then(() => {
     // this gets handled first
   })
},
firstMethod() {
  this.callApi()
  .then(() => {
    // this gets handled second
  })
},
secondMethod() {
  this.callApi()
  .then(() => {
    // or this gets handled second
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...