Comment rompre la chaîne des promesses ?
instance.interceptors.response.use((response) ->
# my server returns {"status": "success", "data": ...}
# or {"status": "fail", "data": ...}
server_response = response.data
if server_response.status == 'fail'
alert(server_response.data) # global alert when status == 'fail'
# this will throw a "> Uncaught (in promise) ..."
# how can i do to prevent/stop it enter into the next then()?
# only when server_response.status == 'success' enter the `then` function
return Promise.reject(response)
# only status == 'success' will reach here:
return response
# in my button actions
instance
.post('accounts/login', account)
.then (response) ->
# if i don't use Promise.reject() in the interceptors,
# everytime i will use a if:
if response.data.status == 'success'
doThings(response)
# but i want this
doThings(response)
en angulaire :
http://blog.zeit.io/stop-a-promise-chain-without-using-reject-with-angular-sq/
dans l'oiseau bleu :
http://openmymind.net/Cancelling-Long-Promise-Chains/
les exemples ci-dessus cassent les chaînes dans then()
, axios peut-il également le casser dans l'intercepteur, quelque chose comme :
instance.interceptors.response.use((response) ->
if someCondition(response)
return null # break the chain
else
return response
Je ne vous recommande pas de le faire, mais si vous le voulez enfin, vous pouvez retourner une promesse sans issue dans vos intercepteurs. Par exemple:
instance.interceptors.response.use((response) => {
if (someCondition(response) {
return new Promise(() => {});
}
return response;
});
Je n'aimais pas l'idée d'utiliser une promesse qui ne se résout ou ne rejette jamais, j'ai donc choisi d'utiliser l'annulation de bluebird pour faire quelque chose comme ça :
axios.interceptors.response.use(null, error => {
let promise = new Promise(resolve, reject) => {
setTimeout(() => {
<code>
promise.cancel()
})
})
return promise
})
le setTimeout permet à la promesse de s'initialiser afin qu'une promesse appropriée soit toujours renvoyée par l'intercepteur et que .cancel()
puisse être appelé après le fait
Répondre à @rubennorte :
Je ne vous recommande pas de le faire, mais si vous le voulez enfin, vous pouvez retourner une promesse sans issue dans vos intercepteurs. Par exemple:
instance.interceptors.response.use((response) => { if (someCondition(response) { return new Promise(() => {}); } return response; });
https://stackoverflow.com/a/20068922
En bref - du moins dans les navigateurs modernes - vous n'avez pas à vous soucier des promesses non résolues tant que vous n'avez pas de références externes à celles-ci
Commentaire le plus utile
Je ne vous recommande pas de le faire, mais si vous le voulez enfin, vous pouvez retourner une promesse sans issue dans vos intercepteurs. Par exemple: