zoukankan      html  css  js  c++  java
  • node 同步js代码超越昨天的自己系列(5)

    超越昨天的自己系列(5)

    如果你不清楚什么是node.js,建议google一下。就算你能保证将来的项目中不会使用,也无法保证未来的吹牛谈资中不会涉及。
    关于node,前面的文章:摸我
     
     Node.js通过异步机制使请求无阻塞,达到并行请求的目的,这也是它能成为服务器代码的替代方案的原因,无阻塞导致它的接受请求能力很大,但事实上如果业务实现依然使用它的话,必然会拖累它的性能。比如说耗时的工作,最好和它的接收请求模块异步分开。
     
    在实际的编码中,一定会遇到顺序执行的问题:
    步骤1:从数据库A表中取数据a
    步骤2:把a数据写入B表中
    那么在写入B表之前必须先取得a数据,首先想到的是写两个function,依次调用。这样会导致处理数据库这样的操作将会是单线程的node很有压力,因为在这段时间里它将不能处理请求!!!
     
    方案1:使用回调函数(注意注释即可)
    exports.news = function (req, res) {
        logger.info('request for /news');
        var info = req.body;
        var userId = null;
        var advIds = [];
         // 数据库处理步骤1
        dao.getUserIdAndAreaByImsiAndAppId(info.imsi, info.appid, function (err, rows) {
            if (err) {
                logger.error('news error');
            }
            logger.debug("news: %j", info);
            if (rows == null || rows.length == 0) {
                res.writeHead(200, {"Content-Type": "application/json", 'charset': 'utf-8'});
                res.end();
                return;
            }
            userId = rows[0].id;
            var areaCode = rows[0].area;
            // 数据库处理步骤2
            dao.getAdvIds(userId, info.appid, function (err, rows) {
                if (err) {
                    res.writeHead(200, {"Content-Type": "application/json", 'charset': 'utf-8'});
                    res.end();
                    logger.error(err);
                    return;
                }
                if (rows.length <= 0) {
                    res.writeHead(200, {"Content-Type": "application/json", 'charset': 'utf-8'});
                    res.end();
                    return;
                }
                for (var index in rows) {
                    advIds.push(rows[index].adv_id);
                }
    
                   // 数据库处理步骤3
                dao.getAdv(info.adStyle, areaCode, advIds, function (err, rows) {
                    if (err) {
                        res.writeHead(200, {"Content-Type": "application/json", 'charset': 'utf-8'});
                        logger.error('getAdv error: ' + err);
                        res.end();
                        return;
                    }
                    if (rows.length <= 0) {
                        logger.debug('没有找到广告');
                        res.writeHead(200, {"Content-Type": "application/json", 'charset': 'utf-8'});
                        res.end();
                        return;
                    }
                    var advert = rows[0];
                        // 数据库处理步骤4
                    dao.updateAdvPush_state(userId, info.appid, advert.id, function (err, rst) {
                        if (err) {
                            logger.error('update advert in tb_user_advert by advId error" id=' + advert.id + ',' + err);
                            //more error handling action
                            return;
                        }
                        logger.debug('update advert push state success: advId=%d', advert.id);
                    });
                   
                    res.writeHead(200, {"Content-Type": "application/json"});
                    res.write(advert.body);
                    res.end();
                });
            });
        });
    };
    
    
     
    方案2:使用node的事件监听
    exports.location = function (req, res) {
        logger.info("--location begin--");
        var info = req.body;
        var imsi = info.imsi;
        var appId = info.appid;
        var lat = info.lat;
        var lgt = info.lgt;
        logger.info("imsi:" + imsi + "appId:" + appId + "lat:" +lat + "lgt:" + lgt);
    
        var city;
        var area;
         //数据库处理步骤1
        getCity(lat, lgt, function (err, rst) {
            city = rst.city;
            if (!city) {
                logger.debug('city not exist: lgt=%s, lat=%s', lgt, lat);
            }
            logger.debug('city got: lgt=%s, lat=%s', lgt, lat);
            dao.emit('getCityOK');
        });
         //数据库处理步骤2
        dao.once('getCityOK', function () {
            dao.getCityCode(city, function (err, rows) {
                logger.debug('get into tagGetCityCode');
                if (err) {
                    logger.error('getCityCode error, city=%s', city);
                }
                if (rows.length <= 0) {
                    logger.debug('city not exist in the databse, city:%s', city);
                    user.area = undefined;
                }
                else {
                    area = rows[0].id;
                    logger.debug('get City Code: id=%d', area);
                }
                dao.emit('getCityCodeOK');
            });
        });
         //数据库处理步骤3
        dao.once('getCityCodeOK', function () {
            dao.updateUserArea(imsi, appId, area, function(err, rst){
                if (err) {
                    logger.error('update area in tb_user by imsi and app_id error" imsi=' + imsi + ','+ "app_id="+ appId + err);
                    return;
                }
                logger.debug('update user area success: area=%s', area);
            })
        });
        logger.info("--location end--");
        res.send('');
    };
    方案n:
    上面的代码无论采用哪一种方案,代码很变扭,阅读困难,重用代码很困难。
    就有了牛人自己写的解决方案:
     

     

    --------------------------------------------------

    让我们继续前行!

  • 相关阅读:
    Java Lambda表达式初探
    解开lambda最强作用的神秘面纱
    常用正则表达式
    js,java时间处理
    Java 8新特性探究(二)深入解析默认方法
    Java 8里面lambda的最佳实践
    lambda表达式和闭包
    Lambda语法篇
    lambda表达式
    依赖注入和控制反转的理解
  • 原文地址:https://www.cnblogs.com/killbug/p/3136716.html
Copyright © 2011-2022 走看看