Axios: ¿Cómo romper la cadena de promesas en los interceptores?

Creado en 19 feb. 2017  ·  3Comentarios  ·  Fuente: axios/axios

¿Cómo romper la cadena de promesas?

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 angular:
http://blog.zeit.io/stop-a-promise-chain-without-using-reject-with-angular-sq/

en bluebird:
http://openmymind.net/Cancelling-Long-Promise-Chains/

los ejemplos anteriores rompen cadenas en then() , ¿pueden los axios romperlo también en el interceptor, algo como:

instance.interceptors.response.use((response) ->
    if someCondition(response)
        return null  # break the chain
    else
        return response

Comentario más útil

No te recomiendo que lo hagas, pero si finalmente lo deseas, puedes devolver una promesa que nunca se resolverá en tus interceptores. P.ej:

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

Todos 3 comentarios

No te recomiendo que lo hagas, pero si finalmente lo deseas, puedes devolver una promesa que nunca se resolverá en tus interceptores. P.ej:

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

No me gustó la idea de usar una promesa que nunca se resuelve o rechaza, así que opté por usar la cancelación de bluebird para hacer algo como esto:

axios.interceptors.response.use(null, error => {
    let promise = new Promise(resolve, reject) => {
        setTimeout(() => {
            <code>
            promise.cancel()
        })
    })
    return promise
})

el setTimeout permite que la promesa se inicie a sí misma para que el interceptor devuelva una promesa adecuada y se pueda llamar .cancel() después del hecho

Responder a @rubennorte :

No te recomiendo que lo hagas, pero si finalmente lo deseas, puedes devolver una promesa que nunca se resolverá en tus interceptores. P.ej:

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

https://stackoverflow.com/a/20068922

En resumen, al menos en los navegadores modernos, no tiene que preocuparse por las promesas sin resolver siempre que no tenga referencias externas a ellas.

¿Fue útil esta página
0 / 5 - 0 calificaciones