Reputation: 7601
I have a simple async
function. It just sends a request and returns the data:
export const updatePanorama = async ({ commit }, payload) => {
const urlEnd = '/v1/pano/update'
const type = 'post'
const resp = await api.asyncRequest(urlEnd, type, payload)
commit('SET_PANORAMA', resp.data)
return resp
}
And this is how I'm using the function:
handleUpdatePanorama (panorama) {
const payload = {}
this.updatePanorama(payload).then(resp => {
this.setIsLoading(false)
this.handleAlert('updateSuccess', 'success')
}).catch(() => {
this.setIsLoading(false)
this.handleAlert('updateError', 'danger')
})
},
The problem is, the code after catch
runs if there's an error inside then
. But this way I don't know whether the catch error is an request error or and error triggered by the code inside then.
I'm trying try
and catch
to solve that problem:
handleUpdatePanorama (panorama) {
try {
const payload = {}
const resp = await this.updatePanorama(payload)
console.log('resp:', resp)
this.setIsLoading(false)
this.handleAlert('updateSuccess', 'success')
} catch (err) {
this.setIsLoading(false)
this.handleAlert('updateError', 'danger')
})
},
However, I get an unexpected token error in this line: await this.updatePanorama(payload)
What am I doing wrong?
Upvotes: 0
Views: 180
Reputation: 1
If you need to handle errors specifically from updatePanorama, use the second argument to .then(onSuccess, onError)
handleUpdatePanorama(panorama) {
const payload = {}
this.updatePanorama(payload).then(resp => {
this.setIsLoading(false)
this.handleAlert('updateSuccess', 'success')
}, err => {
// handle error from updatePanorama
// you can throw err if you also want to handle the error in .catch()
}).catch(() => {
this.setIsLoading(false)
this.handleAlert('updateError', 'danger')
})
}
note: if you return
(or have no return statement) from the error handler, any subsequent .then(onSuccess
will execute, if you throw an error (or return Promise.reject() for example, then the .catch() code will also run
Upvotes: 1
Reputation: 664307
The problem is, the code after
catch
runs if there's an error insidethen
The solution for that is to not use catch
, but the second then
parameter. Have a look at the difference between .then(…).catch(…)
and .then(…, …)
for details.
I'm trying
try
andcatch
to solve that problem
That won't work, the catch
clause will still be called if there's an exception thrown by setIsLoading
or handleAlert
.
I get an unexpected token error. What am I doing wrong?
You have not declared the handleUpdatePanorama
method as async
.
To mitigate the issues and fix the syntax, you could write
async handleUpdatePanorama (panorama) {
var result
try {
const payload = {}
const resp = await this.updatePanorama(payload)
console.log('resp:', resp)
result = ['updateSuccess', 'success']
} catch (err) {
result = ['updateError', 'danger']
} finally {
this.setIsLoading(false)
}
this.handleAlert(...result)
},
Upvotes: 1