Bagaimana cara memutus rantai janji?
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)
dalam sudut:
http://blog.zeit.io/stop-a-promise-chain-without-using-reject-with-angular-sq/
di burung biru:
http://openmymind.net/Cancelling-Long-Promise-Chains/
contoh di atas memutus rantai di then()
, dapatkah axios memutusnya juga di interseptor, seperti:
instance.interceptors.response.use((response) ->
if someCondition(response)
return null # break the chain
else
return response
Saya tidak menyarankan Anda melakukannya, tetapi jika Anda akhirnya menginginkannya, Anda dapat mengembalikan janji yang tidak pernah terselesaikan di pencegat Anda. Misalnya:
instance.interceptors.response.use((response) => {
if (someCondition(response) {
return new Promise(() => {});
}
return response;
});
Saya tidak menyukai gagasan menggunakan janji yang tidak pernah diselesaikan atau ditolak, jadi saya memilih untuk menggunakan pembatalan bluebird untuk melakukan sesuatu seperti ini:
axios.interceptors.response.use(null, error => {
let promise = new Promise(resolve, reject) => {
setTimeout(() => {
<code>
promise.cancel()
})
})
return promise
})
setTimeout memungkinkan janji untuk menginisialisasi dirinya sendiri sehingga janji yang tepat masih dikembalikan dari pencegat dan .cancel()
dapat dipanggil setelah fakta
Balas ke @rubennorte :
Saya tidak menyarankan Anda melakukannya, tetapi jika Anda akhirnya menginginkannya, Anda dapat mengembalikan janji yang tidak pernah terselesaikan di pencegat Anda. Misalnya:
instance.interceptors.response.use((response) => { if (someCondition(response) { return new Promise(() => {}); } return response; });
https://stackoverflow.com/a/20068922
Singkatnya - setidaknya di browser modern - Anda tidak perlu khawatir tentang janji yang belum terselesaikan selama Anda tidak memiliki referensi eksternal untuk itu
Komentar yang paling membantu
Saya tidak menyarankan Anda melakukannya, tetapi jika Anda akhirnya menginginkannya, Anda dapat mengembalikan janji yang tidak pernah terselesaikan di pencegat Anda. Misalnya: