Saya menggunakan $http
di AngularJs, dan saya tidak yakin tentang cara menggunakan janji yang dikembalikan dan menangani kesalahan.
Saya memiliki kode ini:
$http
.get(url)
.success(function(data) {
// Handle data
})
.error(function(data, status) {
// Handle HTTP error
})
.finally(function() {
// Execute logic independent of success/error
})
.catch(function(error) {
// Catch and handle exceptions from success/error/finally functions
});
Apakah ini cara yang baik untuk melakukannya, atau ada cara yang lebih mudah?
success()
,error()
danfinally()
dikombinasikan dengancatch()
? Atau apakah saya harus menggunakanthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
danerror
(lebih suka.then
dan.catch
sebaliknya, Anda dapat (dan harus) menghilangkanerrorFunction
dari.then
penggunaan accatch
seperti dalam kode saya di atas).success
/error
? Juga Eclipse saya mengamuk ketika melihat.catch(
, jadi saya gunakan["catch"](
untuk saat ini. Bagaimana cara menjinakkan Eclipse?.success
dan.error
, $ http mengembalikan q janji $ dengan penambahan darisuccess
danerror
penangan - Namun, penangan ini tidak rantai dan umumnya harus dihindari jika / bila memungkinkan. Secara umum - jika Anda memiliki pertanyaan, sebaiknya tanyakan sebagai pertanyaan baru dan bukan sebagai komentar pada pertanyaan lama.Lupakan tentang penggunaan
success
danerror
metode.Kedua metode tersebut tidak digunakan lagi di sudut 1.4. Pada dasarnya, alasan di balik penghentian ini adalah karena mereka tidak ramah rantai , bisa dikatakan.
Dengan contoh berikut, saya akan mencoba menunjukkan apa yang saya maksud
success
danerror
tidak ramah rantai . Misalkan kita memanggil API yang mengembalikan objek pengguna dengan alamat:Objek pengguna:
Panggilan ke API:
Apa yang terjadi?
Karena
success
danerror
mengembalikan janji asli , yaitu yang dikembalikan oleh$http.get
, objek yang diteruskan ke callbackthen
adalah seluruh objek pengguna , artinya input yang sama kesuccess
callback sebelumnya .Jika kami merantai dua
then
, ini tidak akan terlalu membingungkan:sumber
success
danerror
yang hanya ditambahkan ke segera kembali dari$http
panggilan (tidak prototipe), jadi jika Anda memanggil metode janji lain di antara mereka (seperti, Anda biasanya sebutreturn $http.get(url)
dibungkus perpustakaan dasar, tetapi kemudian memutuskan untuk beralih pemintal di panggilan perpustakaan denganreturn $http.get(url).finally(...)
) maka Anda tidak akan lagi memiliki metode kenyamanan tersebut.Saya pikir jawaban sebelumnya benar, tetapi berikut adalah contoh lain (hanya fyi, success () dan error () tidak digunakan lagi menurut halaman Utama AngularJS :
sumber
Jenis perincian apa yang Anda cari? Anda biasanya bisa bertahan dengan:
Saya telah menemukan bahwa "akhirnya" dan "menangkap" lebih baik saat merangkai banyak janji.
sumber
loading = false
).catch()
MetodeDalam kasus Angular $ http, fungsi success () dan error () akan membuka bungkus objek respons, sehingga tanda tangan panggilan balik akan menjadi seperti $ http (...). Success (fungsi (data, status, header, config))
untuk then (), Anda mungkin akan berurusan dengan objek respons mentah. seperti yang diposting di dokumen API AngularJS $ http
.Catch terakhir (...) tidak akan diperlukan kecuali ada kesalahan baru yang muncul di rantai janji sebelumnya.
sumber
Saya melakukannya seperti yang disarankan Bradley Braithwaite di blognya :
Ini cukup stabil dan aman dan jika Anda memiliki kondisi lain untuk menolak janji, Anda selalu dapat memfilter data Anda dalam fungsi sukses dan memanggil
deferred.reject(anotherReason)
dengan alasan penolakan.Seperti yang disarankan Ryan Vice di komentar , ini mungkin tidak terlihat berguna kecuali Anda sedikit mengutak-atik responsnya.
Karena
success
danerror
tidak digunakan lagi sejak 1.4 mungkin lebih baik menggunakan metode janji regulerthen
dancatch
dan mengubah respons di dalam metode tersebut dan mengembalikan promise dari respons yang diubah itu.Saya menunjukkan contoh yang sama dengan kedua pendekatan dan pendekatan ketiga di antara:
success
danerror
pendekatan (success
danerror
mengembalikan janji respons HTTP, jadi kami membutuhkan bantuan$q
untuk mengembalikan janji data):then
dancatch
pendekatan (ini sedikit lebih sulit untuk diuji, karena lemparan):Namun ada solusi setengah jalan (dengan cara ini Anda dapat menghindari
throw
dan bagaimanapun Anda mungkin perlu menggunakan$q
untuk mengejek perilaku janji dalam pengujian Anda):Segala jenis komentar atau koreksi dipersilakan.
sumber
success()
danerror()
tidak akan membalas janji baru sepertithen()
halnya. Dengan$q
kami membuat pabrik kami mengembalikan janji data, bukan janji respons HTTP.