ExtJS的定時任務
作者: fiker 發布於 十二.12, 2009, 所屬分類: ExtJs
最近用ExtJS做了一個管理系統,需要實現定時檢測登錄狀態,如果狀態已經失效,則提示重新登錄,以前是使用setInterval定時執行JQuery的ajax或getJSON方法,定時訪問一個鏈接,如login.php?act=check,根據返回的結果判斷是否登錄狀態。
返回值用JSON格式,用state節表示登錄狀態。
如果狀態有效則為:{“success”:”true”,”state”:”true”}
無效則為:{“success”:”true”,”state”:”false”}
success是ext判斷是否正確的調用了接口並返回了正確的結果,是ajax的狀態;
state是用PHP判斷當前用戶的登錄狀態的,是自定義狀態,也就是ajax的數據。
ExtJS的定時任務是通過Ext.TaskMgr實現的。用它的start和stop方法來啟動/停止定時任務。
本着模塊化的思想,把checkLogin做成了一個單一的函數,然后用Ext.TaskMgr定時執行;
如果登錄狀態失效,則停止任務,並提示已經長時間未操作,請重新登錄。
提示框彈出來的時候就要stop這個任務,否則會一直彈對話框,雖然不會彈出多個,但對程序的性能還是有影響的。
// JavaScript Document
var task_CheckLoginState;//聲明任務變量
Ext.onReady(function(){
task_CheckLoginState = {
run: checkLogin,//執行任務時執行的函數
interval: 10000//任務間隔,毫秒為單位,這里是10秒
}
Ext.TaskMgr.start(task_CheckLoginState);//初始化時就啟動任務
});
function showlogin() {
//顯示登錄界面
}
//檢查登錄狀態的函數
function checkLogin(){
Ext.Ajax.request({
url: 'login.php',//執行登錄狀態檢查的程序
disableCaching: true,//是否禁用緩存,當然要禁用
timeout: 10000,//最大等待時間,超出則會觸發超時
success: function(response, option){//ajax請求發送成功時執行
if (!response || response.responseText == '') {//返回的內容為空,即服務器停止響應時
Ext.TaskMgr.stop(task_CheckLoginState);
Ext.MessageBox.show({
title: '錯誤',
msg: '在檢測您的登錄狀態時發生錯誤,請稍候再次進行登錄。',
buttons: Ext.Msg.OK,
icon: Ext.MessageBox.ERROR,
fn: function(btn, text){
if (btn == 'ok') {
showlogin();//顯示登錄界面
}
}
});
return;
} else {
result = Ext.decode(response.responseText);
if (result.success == 'true') {//success是ext用來判斷訪問url是否成功的依據
if (result.state == 'true') {//state是自定義的返回值,用來標識登錄狀態是否有效
return true;
} else {//登錄狀態失效
Ext.TaskMgr.stop(task_CheckLoginState);
Ext.MessageBox.show({
title: '登錄檢測',
msg: '您已經長時間未操作或已經退出登錄,請重新登錄。',
buttons: Ext.Msg.OK,
icon: Ext.MessageBox.INFO,
fn: function(btn, text){
if (btn == 'ok') {
showlogin();//顯示登陸界面
}
}
});
return false;
}
} else {//success的返回結果不是true,這種情況很少發生
Ext.TaskMgr.stop(task_CheckLoginState);
Ext.MessageBox.show({
title: '錯誤',
msg: '在檢測您的登錄狀態時發生網絡錯誤,請確認您已經鏈接網絡后再次進行登錄。',
buttons: Ext.Msg.OK,
icon: Ext.MessageBox.ERROR,
fn: function(btn, text){
if (btn == 'ok') {
showlogin();//顯示登陸界面
}
}
});
}
}
},
failure: function(data){//ajax請求發送失敗或超時
Ext.TaskMgr.stop(task_CheckLoginState);
Ext.MessageBox.show({
title: '錯誤',
msg: '在檢測您的登錄狀態時發生網絡錯誤,請確認您已經鏈接網絡后再次進行登錄。',
buttons: Ext.Msg.OK,
icon: Ext.MessageBox.ERROR,
fn: function(btn, text){
if (btn == 'ok') {
showlogin();//顯示登錄界面
}
}
});
},
params: {
act: 'check'
}
});
return true;
}