ExtJS的定时任务(转)

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;
}

原文地址:https://www.cnblogs.com/dwfbenben/p/2485899.html