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:
EventProxy :
Jscex:
--------------------------------------------------
让我们继续前行!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?