Axios: como quebrar a cadeia de promessa em interceptores?

Criado em 19 fev. 2017  ·  3Comentários  ·  Fonte: axios/axios

Como quebrar a cadeia de promessas?

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)

em angular:
http://blog.zeit.io/stop-a-promise-chain-without-using-reject-with-angular-sq/

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

os exemplos acima quebram cadeias em then() , os axios podem quebrá-la também no interceptador, algo como:

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

Comentários muito úteis

Eu não recomendo que você faça isso, mas se você finalmente quiser, você pode retornar uma promessa infindável para seus interceptores. Por exemplo:

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

Todos 3 comentários

Eu não recomendo que você faça isso, mas se você finalmente quiser, você pode retornar uma promessa infindável para seus interceptores. Por exemplo:

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

Não gostei da ideia de usar uma promessa que nunca resolve ou rejeita, então optei por usar o cancelamento do bluebird para fazer algo assim:

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

o setTimeout permite que a promessa se inicialize de forma que uma promessa apropriada ainda seja retornada do interceptor e .cancel() possa ser chamada após o fato

Responder a @rubennorte :

Eu não recomendo que você faça isso, mas se você finalmente quiser, você pode retornar uma promessa infindável para seus interceptores. Por exemplo:

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

https://stackoverflow.com/a/20068922

Resumindo - pelo menos nos navegadores modernos - você não precisa se preocupar com promessas não resolvidas, desde que não tenha referências externas a elas

Esta página foi útil?
0 / 5 - 0 avaliações