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:

位置的代码无论选拔哪种方案,代码很变扭,阅读困难,重用代码很艰难。

就有了牛人本人写的消除方案:

 

async:

https://github.com/caolan/async

 

 EventProxy :

https://github.com/JacksonTian/eventproxy

 

Jscex:

https://github.com/JeffreyZhao/jscex

 

 


让我们连续前行!