Axios: bagaimana cara memutus rantai janji di pencegat?

Dibuat pada 19 Feb 2017  ·  3Komentar  ·  Sumber: axios/axios

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

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:

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

Semua 3 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat