Kraken项目中如何巧用Q.allSettled装饰nodejs代码的门面
2015-12-22 15:33
375 查看
若你是以krakenjs作为编写nodejs项目的框架, 这里简单介绍下models的概念。
Kraken将datamodels从controller逻辑中分离出来,从而能有cleaner更有条理的代码。Datamodels置于models文件夹中。当一个新的controller创建了,该框架也会将为你创建一个简单的model.
关于Q.allSettled方法,q包的官方文档里这么介绍说:If you want to wait forall of the promises to either be fulfilled or rejected, you can use
在java中,若我们想得到多个处理结果,可以在service层中整合。而这里的nodejs却只有Routes层和Models层,一开始我们在Routes层 (也可理解controller层) 中处理业务逻辑。这样的弊端是代码看着条理性比较差,并且业务逻辑堆积在controller层,头重脚轻,门面很丑,controller层eg:
Models层中到底发生怎样的变化?见代码。 这里调用 Q.allSettled([ , ])方法即可将两个结果集结合在一起。这样我们将业务逻辑放到models层中做,避免controller层头重脚轻的弊端。
若对此感兴趣,更多q包资料请查阅:
https://www.npmjs.com/package/q
https://github.com/kriskowal/q/wiki/API-Reference
更多kraken知识请查阅:
http://krakenjs.com/
Kraken将datamodels从controller逻辑中分离出来,从而能有cleaner更有条理的代码。Datamodels置于models文件夹中。当一个新的controller创建了,该框架也会将为你创建一个简单的model.
关于Q.allSettled方法,q包的官方文档里这么介绍说:If you want to wait forall of the promises to either be fulfilled or rejected, you can use
allSettled. 引用https://www.npmjs.com/package/q
案例介绍:
来说说我们的问题,大部分情况下我们只需得到一种处理结果返回给controller层即可,但是基于业务,我们有时候需要将多个处理结果合并,这里说的合并,即将多个查询结果重组返回给controller层。在java中,若我们想得到多个处理结果,可以在service层中整合。而这里的nodejs却只有Routes层和Models层,一开始我们在Routes层 (也可理解controller层) 中处理业务逻辑。这样的弊端是代码看着条理性比较差,并且业务逻辑堆积在controller层,头重脚轻,门面很丑,controller层eg:
'use strict'; var Message = require('../../../models/message.js'); module.exports = function(router) { router.post('page', function (req, res){ var options = req.body; var start = options.start, limit = options.limit; var total; Message.getAllMsgCount().then(function(row){ if(row) { total = row[0].count; getAllMsg(total, start, limit); } }); function getAllMsg(total, start, limit){ Message.getAllMessages(start, limit).then(function (messagesData){ if(messagesData){ return res.json({ total: total, messages: messagesData; options: options }); } else { return res.json({ total: 0, messages: [], options: options }); } }).catch(function(err){ return res.json({ code: '', message: '' + err }); }); } }); }
优化方案:
于是经过文档查阅后,我们可以在model层中运用q包里的allSettled方法处理这样的数据,使得上述controller层中代码更新如下eg:'use strict'; var Message = require('../../../models/message.js'); module.exports = function(router) { router.post('page', function (req, res){ Message.getPage(req.body) .then(function (result){ return res.json(result); }) .catch(function (err){ return res.json(new ServiceError('errmsg', 'errcode')); }) }); }
Models层中到底发生怎样的变化?见代码。 这里调用 Q.allSettled([ , ])方法即可将两个结果集结合在一起。这样我们将业务逻辑放到models层中做,避免controller层头重脚轻的弊端。
'use strict'; var jdbc = require('../lib/jdbc.js'); var Q = require('q'); var Message = exports; Message.getPage = function(options){ return Q.allSettled([Message.getMessagesByStartLimit(options.start, options.limit), Message.getAllMsgCount()]) .then(function(results){ var arr = [], rejected = []; results.forEach(function(result){ if (result.state === "fulfilled") { arr.push(result.value); } else { rejected.push(result.reason); } }); if(rejected.length <= 0){ return { messages: arr[0], total: arr[1][0].count, options: options }; } else{ return { messages: [], total: 0, options: options } } }).fail(function(result){ return { messages: [], total: 0, options: options }; }); };
若对此感兴趣,更多q包资料请查阅:
https://www.npmjs.com/package/q
https://github.com/kriskowal/q/wiki/API-Reference
更多kraken知识请查阅:
http://krakenjs.com/
相关文章推荐
- mac 安装node问题
- nodejs npm 安装报错 无法安装 behind a proxy
- Mac OSX 安装nvm(node.js版本管理器)
- cannot read property 'nodeName' of null 的原因
- Java [Leetcode 273]Delete Node in a Linked List
- node c/c++扩展模块build失败.
- node.js实现CURL功能
- 在node.js中使用COOKIE
- web前后端 技术栈
- 记录我这一年的技术之路(nodejs纯干货)
- window下安装nodejs
- nodejs的某些api~(一)node的流1
- Node.js 回调函数
- 用NodeJS实现APNS
- Socket.IO 和 Node.js 入门
- 【LEETCODE】19-Remove Nth Node From End of List
- 【实践】express搭建nodeJS中间层(一)
- 高速理解掌握node.js 字符编码,确码过程 以及base64编解码原理
- NodeJS | Js 对象 module.exports -笔记(1)
- nodejs addon如何生成xcode工程