How to create Server-side Progress indicator in JavaScript?

后端 未结 3 1812
我在风中等你
我在风中等你 2021-01-15 08:00

I want to create a section in my site, where a user has a few simple update buttons.

Each of these update buttons will be going to the serv

3条回答
  •  自闭症患者
    2021-01-15 08:32

    3 years late, but here's a solution I came up with. Bonus: It works in IE7+

    Uses:

    • jQuery 1.9.1
    • jQuery UI 1.10(quick dialog box and progress bar)
    • Remy's EventSource Polyfill
    • JSON2 polyfill

    The event table:

    create table updates(
        evt_id int unsigned not null auto_increment,
        user_id int unsigned not null,
        evt_type enum('start','update','finish') not null,
        evt_msg varchar(255) not null,
        primary key (evt_id)
    )
    

    The HTML:

    run(array(
            ':event_id'=>0,
            ':user_id'=>App::user()->getId(),
            ':type'=>$_POST['type'],
            ':message'=>$_POST['message']
        )))echo 'Inserted';
        return;
    }
    ?>
    
    
    
    tester
    
    
    
    
    
    
    
    
    

    Start event sets the max

    update event: {"progress":"","message":""}

    finish event: {"progress":"","message":""}

    message:
    event type:

    The PHP:

    :last_id'));
        $args=array(':user_id'=>App::user()->getId(),':last_id'=>0);
        $stm->bindParam(':user_id',$args[':user_id'],PDO::PARAM_INT);
        $stm->bindParam(':last_id',$args[':last_id'],PDO::PARAM_INT);
        $failures=0;
        $nomsg=0;
        if(!isset($_SERVER['HTTP_LAST_EVENT_ID'])){
            $start=new PDOStatementWrapper(db_prepare($db,'SELECT * FROM updates WHERE user_id=:user_id ORDER BY evt_id DESC'));
            $start->bindValue(':user_id',$args[':user_id'],PDO::PARAM_INT);
            $startwait=0;
            while(1){
                if($startwait>MAX_START_WAIT){
                    printEvent(0,'finish','Timed out waiting for the process to start.');
                    return;
                }
                sleep(5);
                $startwait++;
                if(!$start->run()){
                    printEvent(0,'finish','DB error while getting the starting event.');
                    return;
                }
                while($start->loadNext()){
                    if($start->get('evt_type')=='finish')continue 2;
                    if($start->get('evt_type')=='start')break;
                }
                if($start->get('evt_type')=='start'){
                    $args[':last_id']=$start->get('evt_id');
                    printEvent($start->get('evt_id'),'start',$start->get('evt_msg'));
                    break;
                }
            }
        }else
            $args[':last_id']=$_SERVER['HTTP_LAST_EVENT_ID'];
        if($args[':last_id']===0){
            printEvent(0,'finish','ll');
            exit;
        }
        while(1){
            sleep(1);
            if(!$stm->run()){
                $failures++;
                if($failures>MAX_FAILURES){
                    printEvent(0,'finish','Max failures reached.');
                    break;
                }
            }
            if($stm->loadNext()){
                $failures=0;
                $nomsg=0;
                do{
                    if($stm->get('evt_type')=='finish')break;
                    $args[':last_id']=$stm->get('evt_id');
                    printEvent($stm->get('evt_id'),$stm->get('evt_type'),$stm->get('evt_msg'));
                }while($stm->loadNext());
                if($stm->get('evt_type')=='finish'){
                    printEvent($args[':last_id'],'finish',$stm->get('evt_msg'));
                    break;
                }
            }else{
                $nomsg++;
                if($nomsg>MAX_WAIT){
                    exit;//TODO: test
                }
            }
        }
    }else{
        printEvent(0,'close','Unknown event type.');
    }
    
    function printEvent($id,$name,$data){
        echo "id: $id\nevent: $name\n";
        if(is_array($data)){
            foreach($data as $datum)
                echo "data: $datum\n";
            echo "\n";
        }else
            echo "data: $data\n\n";
        flush();
        if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
            $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest')exit;//ajax request. Need to kill the connection.
    }
    

    In case you were wondering about PDOStatementWrapper the source for it is here. Sorry it doesn't include anything integrated with CodeIgniter.

提交回复
热议问题