超越昨天的自己系列(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 = [];// 数据库处理步骤1dao.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;// 数据库处理步骤2dao.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);}// 数据库处理步骤3dao.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];// 数据库处理步骤4dao.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 actionreturn;}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;//数据库处理步骤1getCity(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');});//数据库处理步骤2dao.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');});});//数据库处理步骤3dao.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

 

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

让我们继续前行!

node 同步js代码-超越昨天的自己系列(5)相关推荐

  1. node.js初探-超越昨天的自己系列(3)

    超越昨天的自己系列(3) 其实,学习这事总是被动的,有一天,当我们明白需要努力学习的时候,才发现,知识的世界是那么的浩淼,见不到岸,甚至见不到日出,迷雾重重,困惑的我们很容易甩一甩手不想继续了.所以说 ...

  2. spring和redis的整合-超越昨天的自己系列(7)

    超越昨天的自己系列(7) 扯淡:  最近一直在慢慢多学习各个组件,自己搭建出一些想法.是一个涉猎的过程,慢慢意识到知识是可以融汇贯通,举一反三的,不过前提好像是研究的比较深,有了自己的见解.自认为学习 ...

  3. node源码详解(四) —— js代码如何调用C++的函数

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource4  本博客同步在https://cnodejs. ...

  4. Node.JS中调用JShaman,加密JS代码

    在Node.JS环境中,调用JShaman的WebAPI接口,对JS代码进行混淆加密. 效果如下: 代码: //js代码 var js_code = `function NewObject(prefi ...

  5. 8 行 Node.js 代码实现代理服务器

    接触 Node.js 已有多年,一直喜欢它的单线程模型和异步IO特性,以及 JavaScript 语言本身的灵活性.同时,JavaScript 前后端通吃,在全栈开发领域具有独特的优势.今天就来看看作 ...

  6. node.js 代码修改 自动识别重启工具

    npm install supervisor -g supervisor xx.js 代替 node xx.js 能实现自动重启服务,识别代码更新

  7. Node四种动态加载JS代码方法性能对比

    背景 我们运行node程序的时候,一般情况下,js代码都是事先写好在js文件里,然后启动的时候加载到内存中执行的.在一些特殊的需求下,我们可能会执行一些动态的js代码. 四种方法 目前我能想到的方法有 ...

  8. 【笔记】Pycharm配置Node.js运行js代码

    最近在学习关于Js逆向的知识,需要在PyCharm中运行Js程序,记录一下配置过程. 安装Node.js Node.js中文网 选择自己电脑对应的安装包下载暗转即可 安装好软件后,配置node.js环 ...

  9. node.js代码总结

    ------------------------- node.js 基础 ---------------------------- 1. node.js 基础语法及快捷键 node -v 查看node ...

最新文章

  1. linux ftp 团队认证,linux下ftp和ftps以及ftp基于mysql虚拟用户认证服务器的搭建
  2. 马斯克的90后合伙人离职Neuralink!5岁学编程,曾创立2家公司
  3. 将秒(非时间戳)转化成 ** 小时 ** 分
  4. Django框架连接MySQL数据库
  5. Django的路由层
  6. 中小企业电子商务如何发展?
  7. tensorflow精进之路(二十)——使用slim模型库训练自己的数据
  8. Oracle swap 100%案例分析
  9. 屏幕颜色拾取器 (VC++)
  10. 如何一键查询物流信息并筛选出未签收单号
  11. esp8266使用安信可IDE编译、烧录
  12. 跨时区时间运算以及时间实时更新方法
  13. template的使用,泛式编程
  14. CAD高版本窗体阵列LISP_如何把CAD高版本阵列对话框在低版本调出来? _ 一堂课...
  15. 标签云的实现(使用jQuery插件jqcloud)
  16. 深圳市专精特新企业申报流程及奖励政策重点介绍,补贴20-50万
  17. 如果有一天不写代码了,还能干点啥?
  18. 头歌 数据结构与算法答案 善用目录
  19. 下拉菜单中自动亮度调节P 上背光调节
  20. 复盘2020全球旅游业:新冠疫情巨大冲击下的艰难复苏

热门文章

  1. python split(), os.path.split()和os.path.splitext()函数的区别
  2. angular环境搭建
  3. 线上飙升800%,load达到12的解决过程
  4. LeetCode Rotate Function(寻找规律)
  5. MySQL删除表数据
  6. java的4种内部类
  7. reGeorg+Proxifier使用
  8. Django连接mysql数据库
  9. 001-Java命名规范
  10. 爬虫--用python中requests和urllib模块爬取图片