您的位置:首页 > Web前端 > Node.js

Kraken项目中如何巧用Q.allSettled装饰nodejs代码的门面

2015-12-22 15:33 363 查看
若你是以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
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: