Wie kann man die Versprechenskette durchbrechen?
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)
im Winkel:
http://blog.zeit.io/stop-a-promise-chain-without-using-reject-with-angular-sq/
in bluebird:
http://openmymind.net/Cancelling-Long-Promise-Chains/
Die obigen Beispiele unterbrechen Ketten in then()
, können Axios sie auch in Interceptor unterbrechen, so etwas wie:
instance.interceptors.response.use((response) ->
if someCondition(response)
return null # break the chain
else
return response
Ich empfehle Ihnen dies nicht, aber wenn Sie es endlich wollen, können Sie in Ihren Abfangjägern ein nie auflösendes Versprechen zurückgeben. Z.B:
instance.interceptors.response.use((response) => {
if (someCondition(response) {
return new Promise(() => {});
}
return response;
});
Ich mochte die Idee nicht, ein Versprechen zu verwenden, das sich nie auflöst oder ablehnt, also habe ich mich für die Stornierung von bluebird entschieden, um so etwas zu tun:
axios.interceptors.response.use(null, error => {
let promise = new Promise(resolve, reject) => {
setTimeout(() => {
<code>
promise.cancel()
})
})
return promise
})
setTimeout erlaubt es dem Promise, sich selbst zu initialisieren, so dass immer noch ein richtiges Promise vom Interceptor zurückgegeben wird und .cancel()
im Nachhinein aufgerufen werden kann
Antwort an @rubennorte :
Ich empfehle Ihnen dies nicht, aber wenn Sie es endlich wollen, können Sie in Ihren Abfangjägern ein nie auflösendes Versprechen zurückgeben. Z.B:
instance.interceptors.response.use((response) => { if (someCondition(response) { return new Promise(() => {}); } return response; });
https://stackoverflow.com/a/20068922
Kurz gesagt - zumindest in modernen Browsern - müssen Sie sich keine Sorgen um ungelöste Versprechen machen, solange Sie keine externen Referenzen darauf haben
Hilfreichster Kommentar
Ich empfehle Ihnen dies nicht, aber wenn Sie es endlich wollen, können Sie in Ihren Abfangjägern ein nie auflösendes Versprechen zurückgeben. Z.B: