暫且說到上一回,我們把 api 給 Call 爆了
那麼... 到底是怎麼把它給玩壞(#)的呢?
這一切的緣由都要從 setInterval
說起了..
我們有兩顆按鈕,分別是「去程路線」及「回程路線」
goBtn.addEventListener('click', getGoJson, false);
backBtn.addEventListener('click', getBackJson, false);
function getGoJson(){
var xhr = new XMLHttpRequest();
xhr.open('get', GoUrl);
xhr.send(null);
xhr.onload = function () {
goData = JSON.parse(xhr.responseText);
// ..中間省略
}
setInterval(getGoJson, 30000);
}
function getBackJson(){
var xhr = new XMLHttpRequest();
xhr.open('get', BackUrl);
xhr.send(null);
xhr.onload = function () {
goData = JSON.parse(xhr.responseText);
// ..中間省略
}
setInterval(getBackJson, 30000);
}
有看出端倪了嗎?
嗯...沒錯,我把 setInterval
寫到了 click 事件裡面
有,而且還滿嚴重的..
因為 setInterval
如果沒有被移除,就會一直存在
還是不清楚?
這麼做最恐怖的地方就是
「當使用者點擊一次按鈕時,我們會設定一次 setInterval
排程;若使用者點擊兩次,我們會再設定一次相同的排程」
=> 也就是說,當使用者點了十下按鈕,背景其實同時有十個 setInterval
同時在運行
30秒一到就發出10次 Request
而且一開始為了要檢查資料到底有沒有正確載入,我還很喪心病狂的使用3秒更新一次..
理所當然地,不出30分鐘 api 就立刻被 Call 爆啦
另外這麼做還有一個大問題
由於預設是去程路線的 setInterval
沒有被消除
即使點了回程路線按鈕的當下會把回程的到站時間資料渲染出來
但時間(30秒)一到,原先設定渲染去程路線的 setInterval
就會運作,再把畫面刷成 去程路線
我們改用一個全域變數去紀錄,目前到底要顯示 去程 還是 回程
然後 setInterval
裡面只呼叫一個 checkWay function
結果如下
var check = 'go'; // 預設顯示去程
function checkWay() {
if (check == "go"){
getGoJson();
}
else{
getBackJson();
}
}
checkWay(); //先執行一次讓資料渲染到畫面上
goBtn.addEventListener('click', getGoJson, false);
backBtn.addEventListener('click', getBackJson, false);
function getGoJson(){
clearInterval(getBackJson); // 讓畫面不會渲染出 回程路線
check = "go";
var xhr = new XMLHttpRequest();
xhr.open('get', GoUrl);
xhr.send(null);
xhr.onload = function () {
goData = JSON.parse(xhr.responseText);
// ..中間省略
}
}
function getBackJson(){
clearInterval(getGoJson); // 讓畫面不會渲染出 去程路線
check = "back";
var xhr = new XMLHttpRequest();
xhr.open('get', BackUrl);
xhr.send(null);
xhr.onload = function () {
goData = JSON.parse(xhr.responseText);
// ..中間省略
}
}
setInterval(checkWay, 30000);
這樣子就不會有重複設定 setInterval
,同時也能正確渲染出「去、回程路線的公車到站時間」啦
- Jason 勇者Jason和前端之鑰
- Clover 用Vue與firebase開發訂便當系統實錄
- aflect 我的UI/UX奮鬥屎
- GG 一隻巨大的UI/UX菜鳥
- Jimmy ES666
- R-yin 菜鳥前端奮鬥史(欸?
我是小菜鳥阿陰,我們下次見!