Axios: comment casser la chaîne de promesse dans les intercepteurs ?

Créé le 19 févr. 2017  ·  3Commentaires  ·  Source: axios/axios

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

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:

instance.interceptors.response.use((response) => {
  if (someCondition(response) {
    return new Promise(() => {});
  }
  return response;
});

Tous les 3 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

reggi picture reggi  ·  3Commentaires

tbaustin picture tbaustin  ·  3Commentaires

shaosh picture shaosh  ·  3Commentaires

Spartano picture Spartano  ·  3Commentaires

airtonix picture airtonix  ·  3Commentaires