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

若你是以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/



你可能感兴趣的:(NODE.JS)