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:
    上面的代码无论采用哪一种方案,代码很变扭,阅读困难,重用代码很困难。
    就有了牛人自己写的解决方案:
     

     

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

    让我们继续前行!

  • 相关阅读:
    Power of Cryptography
    Radar Installation
    Emag eht htiw Em Pleh
    Help Me with the Game
    89. Gray Code
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/killbug/p/3136716.html
Copyright © 2011-2022 走看看