Apa yang dimaksud dengan readystate berbeda di XMLHttpRequest, dan bagaimana saya bisa menggunakannya?

113

XMLHttpRequestmemiliki 5 readyStatedetik, dan saya hanya menggunakan 1 di antaranya (yang terakhir, 4).

Untuk apa lainnya, dan aplikasi praktis apa yang dapat saya gunakan?

Marius
sumber

Jawaban:

172

Daftar lengkap readyStatenilainya adalah:

State  Description
0      The request is not initialized
1      The request has been set up
2      The request has been sent
3      The request is in process
4      The request is complete

(dari https://www.w3schools.com/js/js_ajax_http_response.asp )

Dalam praktiknya Anda hampir tidak pernah menggunakan salah satu dari mereka kecuali 4.

Beberapa implementasi XMLHttpRequest memungkinkan Anda melihat respons yang diterima sebagian di responseTextwhen readyState==3, tetapi ini tidak didukung secara universal dan tidak boleh diandalkan.

Kieron
sumber
5
Kesalahan dalam transfer masih memperbarui readyState ke 4. Namun, transfer yang sepenuhnya terputus akan mengatur ulang readyState ke 0. Jadi, kesalahan dalam transfer yang diakibatkan oleh pengalihan sebenarnya bukan "kesalahan" dan Anda dapat memilih untuk mengabaikan logging / melaporkan kesalahan jika readyState dari xhr adalah 0. Agak rapuh, dan jarak tempuh Anda mungkin berbeda-beda tergantung apakah mencatat setiap kejadian / kesalahan adalah "harus dimiliki" atau "menyenangkan untuk dimiliki". Jika yang terakhir, Anda dapat kehilangan peristiwa langka yang mungkin merupakan kesalahan bersama dengan readyState 0.
Greg Pettit
2
+1 ke @MattBianco untuk sarannya. Saya juga ingin menambahkan bahwa Mozilla Developer Network MDN bisa dibilang salah satu situs referensi paling populer dan tepercaya di luar sana untuk semua kebutuhan JavaScript / HTML / CSS Anda. Saat melakukan pencarian google, awali kueri Anda dengan "mdn" dan Anda akan menghemat beberapa sakit kepala.
DondeEstaMiCulo
@GregPettit, dapatkah kita menggunakan readystate 0, tanpa koneksi internet, atau jika ada alasan apa pun di mana "Permintaan tidak diinisialisasi"
Vishal Sharma
4
Saya tidak yakin, @vishalsharma - seingat saya, readystate-nya adalah 0 selama permintaan tidak diinisialisasi. Setelah itu, "penyelesaian" lainnya (baik karena berhasil atau error) akan memperbarui readystate ke 4. Jadi kehilangan internet setelah transfer dimulai akan mengubahnya menjadi 4, bukan kembali ke 0. Jika belum pernah ada internet saat transfer dicoba, itu harus tetap 0; itu hanya akan berpindah ke 1 setelah jabat tangan.
Greg Pettit
Penjelasan untuk readyState 2 salah - atau setidaknya menyesatkan. Shure permintaan telah dikirim, tetapi status tersebut benar-benar mengatakan bahwa semua header tanggapan akhir telah diterima.
ke dalam
32

Jawaban kieron berisi w3schools ref. yang tidak dapat diandalkan oleh siapa pun, jawaban bobince memberikan tautan, yang sebenarnya memberi tahu implementasi asli IE,

jadi inilah dokumentasi asli yang dikutip untuk memahami dengan benar apa yang diwakili oleh readystate:

Objek XMLHttpRequest bisa dalam beberapa status. Atribut readyState harus mengembalikan keadaan saat ini, yang harus berupa salah satu dari nilai berikut:

UNSENT (nilai numerik 0)
Objek telah dibangun.

OPENED (nilai numerik 1)
Metode open () berhasil dipanggil. Selama status ini, header permintaan bisa disetel menggunakan setRequestHeader () dan permintaan bisa dibuat menggunakan metode send ().

HEADERS_RECEIVED (nilai numerik 2)
Semua pengalihan (jika ada) telah diikuti dan semua header HTTP dari respons akhir telah diterima. Beberapa anggota tanggapan dari objek sekarang tersedia.

LOADING (nilai numerik 3)
Badan entitas respons sedang diterima.

SELESAI (nilai numerik 4)
Transfer data telah selesai atau terjadi kesalahan selama transfer (mis. Pengalihan tak terbatas).

Silakan Baca di sini: Penjelasan W3C Tentang ReadyState

Vishal Sharma
sumber
@CharlesWood, tantangan bagi saya ada di sini editor penurunan harga stackoverflow tidak akan menerima merujuk ke w3c .. periksa maka saya memasukkan url pendek dari goo.gl .... saya tidak mengerti mengapa itu tidak memungkinkan saya untuk langsung meletakkan w3c url ...
Vishal Sharma
Huh, saya baru saja mencobanya di kotak pasir dan sepertinya berhasil.
Charles Wood
22

Dokumentasi definitif asli

0, 1dan 2hanya melacak berapa banyak metode yang diperlukan untuk membuat permintaan yang Anda panggil sejauh ini.

3memberi tahu Anda bahwa respons server sudah mulai masuk. Tetapi ketika Anda menggunakan XMLHttpRequestobjek dari laman web, hampir tidak ada (*) yang dapat Anda lakukan dengan informasi itu, karena Anda tidak memiliki akses ke properti yang diperluas yang memungkinkan Anda membaca data parsial.

readyState 4adalah satu-satunya yang memiliki arti.

(*: tentang satu-satunya penggunaan yang dapat saya pikirkan untuk memeriksa readyState 3adalah bahwa ini menandakan beberapa bentuk kehidupan di ujung server, jadi Anda mungkin dapat meningkatkan jumlah waktu Anda menunggu respons penuh ketika Anda menerimanya.)

bobince
sumber
1

onreadystatechange Menyimpan fungsi (atau nama fungsi) yang akan dipanggil secara otomatis setiap kali properti readyState berubah readyState Menyimpan status XMLHttpRequest. Perubahan dari 0 menjadi 4:

0: permintaan tidak diinisialisasi

1: koneksi server dibuat

2: permintaan diterima

3: memproses permintaan

4: permintaan selesai dan tanggapan siap

status 200: "OK"

404 halaman tidak ditemukan

omertalmi
sumber
0
  • 0: Klien TIDAK DIKIRIM telah dibuat. open () belum dipanggil.
  • 1: OPENED open () telah dipanggil.
  • 2: HEADERS_RECEIVED send () telah dipanggil, dan header serta status telah tersedia.
  • 3: MEMUAT Mendownload; responseText menyimpan sebagian data.
  • 4: SELESAI Operasi selesai.

(Dari https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState)

Khurshid Ansari
sumber