web前端非同步資料互動(長連線)
Workers非同步任務
開始(註冊):
1 divobjx=document.getElementsByTagName("div")[0]; 2 var workdong=new Worker("dong.js");//建立work物件 3 workdong.onmessage=function(ee){ 4var resx=ee.data;//得到資料 5divobjx.innerHTML=resx;//資料顯示 6 }
任務檔案(dong.js):
1 var conutx =0; 2 function confun(){ 3postMessage(conutx);//傳送訊息 4conutx++; 5setTimeout(confun,1000);//遞迴呼叫 6 } 7 confun();
停止任務:
1 if(workdong){ 2workdong.terminate(); 3workdong=null; 4 }
獲取伺服器實時資料
客戶端實現EventSource,定時訪問(一般在2-3秒頻率)伺服器以重新整理頁面,每次訪問會執行完伺服器指令碼的所有內容,伺服器可以使用ob_flush();flush();進行一次訪問資料的多條分別輸出。
客戶端:
1 divobjx=document.getElementsByTagName("div")[0]; 2 divobjx1=document.getElementsByTagName("div")[1]; 3 //非同步任務開始 4 varev=new EventSource("dong.php"); 5 ev.onopen=function(e){ 6divobjx1.innerHTML="連結開啟中"; 7 } 8 9 //獲取資料方法一 10 //ev.onmessage=function(e){ 11 //var resx=e.data;//得到資料 12 //divobjx.innerHTML=resx;//資料顯示 13 //} 14 15 //獲取資料方法二 16 ev.addEventListener("newdong",function(e){ 17divobjx.innerHTML=e.data; 18 }); 19 ev.onerror=function(e){ 20divobjx1.innerHTML="連結錯誤或當次執行完畢"; 21 }
伺服器:
1 <?php 2 header('Content-Type: text/event-stream'); 3 for($i=0;$i<5;$i++){ 4//事件名,如果使用方法一進行資料獲取,則必須省略此句 5echo "event:newdong\n"; 6//資料 7echo "data:dongxioadong東東".$i."\n\n"; 8//重新整理,實現逐條傳送 9ob_flush(); 10flush(); 11sleep(1); 12 } 13 ?>