Rumah >hujung hadapan web >tutorial js >Acara Server-Sent
mata teras
Content-type
) dan pengekodan aksara UTF-8. Sintaks untuk pelayan untuk menghantar acara termasuk data, jenis acara, pengenal acara, dan selang semula. text/event-stream
onmessage
lebih fleksibel untuk mengendalikan peristiwa tersuai. addEventListener
Nasib baik, Perkhidmatan Berita Kebangsaan anda mempunyai pasukan pembangunan web yang sangat cemerlang. Mereka membina paparan tatal maklumat sukan yang dikemas kini setiap kali pelanggaran atau skor berlaku. Apabila anda melawat URL, kemas kini akan ditolak terus ke penyemak imbas anda. Sudah tentu, anda akan ingin tahu bagaimana mereka melakukannya. Jawapannya ialah: Pelayan menghantar acara tersebut.
Pelayan menghantar acara adalah cara untuk menggunakan aliran untuk menolak data dan/atau acara DOM dari pelayan ke klien. Ia sesuai untuk petikan saham, skor sukan, pengesanan penerbangan, pemberitahuan e -mel - apa -apa keadaan di mana data perlu dikemas kini secara teratur.
Tunggu!
Saya dengar anda berkata, Tidakkah kita sudah melakukan ini menggunakan xmlhttprequest atau websockets?
Ya, ya. Walau bagaimanapun, berbuat demikian memerlukan memperluaskan objek ini untuk melaksanakan fungsi Eventsource itu sendiri.
langkah berjaga -jaga di sisi pelayan
mari kita lihat cara melanggan aliran menggunakan objek Eventsource. Kemudian kita akan melihat bagaimana peristiwa dihantar dan diproses.
Membuat objek Eventsource adalah mudah.
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});</code>
Pembina Eventsource menerima sehingga dua parameter:
withCredentials
withCredentials
Parameter kamus hanya diperlukan jika permintaan silang domain untuk kelayakan pengguna (cookies). Setakat ini, tiada penyemak imbas menyokong permintaan Eventsource silang domain. Oleh itu, kami tidak akan memasukkan parameter kedua dalam contoh.
Apabila sambungan Eventsource dibuka, ia akan mencetuskan acara
. Kami boleh menentukan fungsi yang mengendalikan peristiwa dengan menetapkan harta. open
onopen
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }</code>untuk menentukan fungsi pengendali untuk peristiwa -peristiwa ini. Kami akan membincangkan punca beberapa peristiwa ralat dalam bahagian "Kesilapan Latihan".
onerror
<code class="language-javascript">evtsrc.onerror = function(openevent){ // 发生错误时执行的操作 }</code>untuk menentukan fungsi pengendali.
onmessage
<code class="language-javascript">evtsrc.onmessage = function(openevent){ // 接收到消息事件时执行的操作 }</code>untuk mendengar acara. Ini adalah satu -satunya cara untuk mengendalikan peristiwa tersuai, seperti yang akan kita lihat di bahagian Peristiwa Pemprosesan.
addEventListener()
<code class="language-javascript">var onerrorhandler = function(openevent){ // 执行的操作 } evtsrc.addEventListener('error',onerrorhandler,false);</code>.
close()
Oleh itu, kami mencipta objek Eventsource dan menentukan pengendali untuk peristiwa pembukaan, mesej, dan ralat. Walau bagaimanapun, agar kaedah ini berfungsi, kami memerlukan URL untuk acara streaming.
<code class="language-javascript">evtsrc.close();</code>menghantar acara dari pelayan
Pelayan menghantar acara adalah coretan teks yang disampaikan sebagai sebahagian daripada aliran dari URL. Agar penyemak imbas untuk merawat data kami sebagai aliran, kita mesti:
Gunakan header
(nilai adalahContent-type
text/event-stream
: Mesej yang akan dihantar.
data:
event:
id:
retry:
yang diperlukan. Dalam contoh ini, kami akan menghantar acara untuk mengumumkan pasukan mana yang bermain dalam perlawanan kejohanan kami. Apabila penyemak imbas menerima teks ini, ia menghantar acara mesej.
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});</code>Nilai medan
data
akan menjadi nilai atribut data
atribut peristiwa mesej. Seperti yang disebutkan di atas, pelayan menghantar acara secara lalai adalah acara mesej. Tetapi seperti yang akan kita bincangkan kemudian, kita juga boleh menghantar peristiwa tersuai dengan memasukkan medan event
.
kita juga boleh menghantar beberapa keping data sebagai satu acara. Setiap sekeping data harus diikuti oleh watak baru (garis baru garis, pulangan kereta, atau kedua -duanya). Di sini kami mengadakan acara yang merangkumi lokasi permainan dan kehadiran ini.
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }</code>
Untuk acara ini, nilai atribut data
akan menjadi: Air Canada Centrentoronto, Ontario, Canadaattendance: 19,800.
Sila ambil perhatian garis kosong antara peristiwa. Agar pelanggan menerima acara, acara itu mesti diikuti dengan garis kosong. Komen bermula dengan kolon.
Kecuali kami menentukan sebaliknya, jenis acara adalah mesej. Untuk melakukan ini, kita perlu memasukkan medan event
. Dalam contoh berikut, kami akan menambah dua acara startingfive
ke aliran kami dan menghantar data kami sebagai rentetan dalam format JSON.
<code class="language-javascript">evtsrc.onerror = function(openevent){ // 发生错误时执行的操作 }</code>
di sini, kita perlu mendengar startingfive
acara bukannya peristiwa mesej. Walau bagaimanapun, medan data
kami masih akan menjadi nilai harta data
acara tersebut.
Kami akan membincangkan sifat data
dan antara muka MessageEvent dalam bahagian "Peristiwa Pemprosesan".
Sekarang, walaupun pelayan menolak peristiwa kepada penyemak imbas, realiti lebih halus. Jika pelayan menyimpan sambungan terbuka, permintaan Eventsource akan menjadi permintaan lanjutan. Jika ia ditutup, penyemak imbas akan menunggu beberapa saat sebelum menyambung semula. Sebagai contoh, jika URL menghantar tag akhir fail, sambungan boleh ditutup.
Setiap penyemak imbas mempunyai selang sambung semula lalai sendiri. Kebanyakan akan menyambung semula selepas 3 hingga 6 saat. Walau bagaimanapun, anda boleh mengawal selang ini dengan memasukkan medan retry
. Bidang retry
menunjukkan berapa banyak milisaat pelanggan harus menunggu sebelum menyambung semula ke URL. Mari kita bina dan tukar acara kami dari contoh di atas untuk memasukkan selang masa 5 (5000 milisaat).
<code class="language-javascript">evtsrc.onmessage = function(openevent){ // 接收到消息事件时执行的操作 }</code>
aliran acara boleh disimpan aktif selagi pelanggan disambungkan. Bergantung pada seni bina dan aplikasi anda, anda mungkin mahu pelayan menutup sambungan secara berkala.
Apabila penyemak imbas menyambung semula ke URL, ia akan menerima sebarang data yang tersedia di titik sambungan. Walau bagaimanapun, untuk paparan tatal maklumat permainan, kami mungkin mahu membiarkan pengunjung mengetahui apa yang dia terlepas. Inilah sebabnya amalan terbaik untuk menetapkan ID ke setiap acara. Dalam contoh berikut, kami menghantar ID sebagai sebahagian daripada acara pemarkahan.
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/',{withCredentials:false});</code>
Nilai harus unik untuk aliran. Dalam kes ini, kami menggunakan masa skor pukulan.
Medan id
menjadi sifat lastEventId
objek acara ini. Tetapi ia mempunyai tujuan lain. Jika sambungan ditutup, penyemak imbas akan memasukkan header Last-Event-ID
dalam permintaan seterusnya. Fikirkannya sebagai penanda buku untuk aliran itu. Jika header Last-Event-ID
wujud, anda boleh menyesuaikan respons aplikasi supaya hanya peristiwa yang mengikutinya.
Seperti yang disebutkan di atas, semua peristiwa lalai ke peristiwa mesej. Setiap acara mesej mempunyai tiga sifat, yang ditakrifkan oleh antara muka MessageEvent.
onmessage
kami akan dipanggil. Ini berfungsi hebat untuk aplikasi yang anda hanya menghantar acara mesej. Walau bagaimanapun, jika anda ingin menghantar skor atau startingfive
acara (seperti yang ditunjukkan dalam contoh kami), batasannya menjadi jelas. Lebih fleksibel menggunakan addEventListener
. Dalam kod berikut, kami menggunakan addEventListener
untuk mengendalikan acara startingfive
.
<code class="language-javascript">var evtsrc = new EventSource('./url_of/event_stream/'); evtsrc.onopen = function(openevent){ // 连接打开时执行的操作 }</code>
(bahagian kedua, disebabkan oleh batasan ruang, sila tanya soalan dalam perenggan.)
Atas ialah kandungan terperinci Acara Server-Sent. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!