文享日志

路由函数优化

博客 JavaScript

发表于2017年11月10日00:48:57

0条评论 230次阅读

        本文讲的是优化路由函数,提升页面访问速度。原来的代码是异步函数多级嵌套,事件串行执行,这样用户等待时间是个事件执行时间和。优化后的代码异步事件分别执行,用户等待时间为个时间执行完成时间最长的那个。

下面是优化前的函数:

router.get('/artical_detiail/:user/:id',function(req,res,next){
        Click.get(req.params.id,function(err,_clicks){
            if (err) {
                req.flash('error',err);
                return res.redirect('/idx/0');
            }
            Click.update(req.params.id,{click:_clicks[0].click+1,zan:_clicks[0].zan,cai:_clicks[0].cai},function(err){
                if(err){
                    req.flash('error',err);
                    return res.redirect('/idx/0');
                }

            Post.get(req.params.name, function(err, posts) {
                if (err) {
                    req.flash('error', err);
                    return res.redirect('/');
                }
                
                var ipost=new Array(3) ,flag = 0;
                //查找文章,返回找到的文章和该文章前后的文章。(用来写链接)
                for (var i = 0; i < posts.length; i++) {
                    if(req.params.id == posts[i].id){
                        ipost[1] = posts[i];
                        i == 0?ipost[0] = 'null':ipost[0] = posts[i-1];
                        i == posts.length-1?ipost[2] = 'null':ipost[2] = posts[i+1];
                        flag = 1;
                    }               
                }
                if (!flag) {
                    req.flash('error','文章不存在');
                    return res.render('index',{title:'文章不存在'});
                }
                Comment.comment_get(req.params.id,function(err,comments){
                    if(err){
                        req.flash('error',err);
                        return res.redirect('/');
                    }
                    res.render('artical_detiail',{
                        title:'文章详情-月光博客',
                        post:ipost,
                        idxn:0,
                        comment : comments,
                        _myclicks : _clicks[0]
                    }); 
                });                     
            });     
        }); 
    });
   );
})

可以看到函数嵌套过深,调用时间是几者调用时间和。



下面是优化后的函数:

router.get('/artical_detiail/:user/:id',function(req,res,next){
    var result = {},count = 0;
    var emitter = new events.EventEmitter();
    
    result['title'] = '文章详情-月光博客';
    result['idxn'] = 0;
    var done = function(key,value){
        count++;
        result[key] = value ;
        if(count === 3){
            res.render('artical_detiail',result); 
        }
    }
    emitter.on('done',done);
    Click.get(req.params.id,function(err,_clicks){
        if (err) {
            req.flash('error',err);
            return res.redirect('/idx/0');
        }
        emitter.emit('done','_myclicks',_clicks[0])
        Click.update(req.params.id,{click:_clicks[0].click+1,zan:_clicks[0].zan,cai:_clicks[0].cai},function(err){
            if(err){
                req.flash('error',err);
                return res.redirect('/idx/0');
            }
        })
    })

    Post.get(req.params.name, function(err, posts) {
        if (err) {
            req.flash('error', err);
            return res.redirect('/');
        }
        
        var ipost=new Array(3) ,flag = 0;
        //查找文章,返回找到的文章和该文章前后的文章。(用来写链接)
        for (var i = 0; i < posts.length; i++) {
            if(req.params.id == posts[i].id){
                ipost[1] = posts[i];
                i == 0?ipost[0] = 'null':ipost[0] = posts[i-1];
                i == posts.length-1?ipost[2] = 'null':ipost[2] = posts[i+1];
                flag = 1;
            }               
        }
        emitter.emit('done','post',ipost);
        if (!flag) {
            req.flash('error','文章不存在');
            return res.render('index',{title:'文章不存在'});
        }
    });
    Comment.comment_get(req.params.id,function(err,comments){
        if(err){
            req.flash('error',err);
            return res.redirect('/');
        }
        emitter.emit('done','comment',comments);
    });

});

三个异步I/O事件分别执行,每个事件执行结果发射,监听到后,执行函数,计数器加一。到第三个事件完成,向模板发送数据。所用时间为三个事件用时最长的那个决定。。


有封装好的EventProxy模块也可以实现上面的优化,并且更简单。

同样使用emit发射,使用all监听所有事件是否完成。完成则执行callback。

这里没有用是因为我想自己实现一下。。

👍 2  👎 0
共有0条评论

发表新评论

提交

广告展示

腾讯云推广 阿里云推广