专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

基于MongoSkin的Promise风格的数据库读写示范

发布时间:2011-06-29 18:25:10 文章来源:www.iduyao.cn 采编人员:星星草
基于MongoSkin的Promise风格的数据库读写示例

Promise是一种异步编程的代码书写方式,和Async模块一样,都能提高代码的可读性和可维护性。Async封装的比Promise要好,但是灵活性特别是彻底的去CallBack化会比Promise要差一点。下面直接贴下源代码,注释很详细:

(1)数据库连接文件:dbConfig

/**
 * Created by apple on 2014/12/29.
 */
var mongoskin = require('mongoskin');
var db = null;
var dbName = "yqbChat";

/**
 * @function
 * @param collectionName
 * @returns {SkinCollection|null|*}
 */
exports.getCollection = function (collectionName) {
    if (!db) {
        //连接本机mongodb ,使用帐号密码连接 mongoskin.db('username:password@服务器ip/数据库名
        db = mongoskin.db('mongodb://127.0.0.1:27017/' + dbName + '?auto_reconnect=true&poolSize=3',
            {numberOfRetries: 1, retryMiliSeconds: 500, safe: true, native_parser: true},
            {socketOptions: {timeout: 5000}}
        );
    }
    return db.collection(collectionName);
};

/**
 * @function 关闭数据库
 */
exports.dbClose = function()
{
    if (!db) {
        db.close();
    }
};

(2)Model 层文件

/**
 * Created by apple on 2015/1/17.
 */
/** 聊天室数据结构
 *
 * //某两个用户对应的聊天室为一个集合,一个消息为一个文档
 * @{singleChatRoomID}
 *  @_id 信息编号
 *  @msgState 0-未读 1-已读 (int类型)
 *  @msgContent 消息内容
 *  @msgSend 消息发送者的user_id
 *  @create_time
 *
 */

//获取MongoDB的连接实例
var moment = require('moment');
var Q = require("q");

//存放聊天室配置集合
var singleChatRoomConfigInstance = null;

//当前时间点
var currentDateTime = moment().format("YYYY-M-D H:m:s");

/**
 * @function 根据singleChatRoomID在singleChatRoomConfig文档中搜索配置信息
 * @param singleChatRoomID 聊天室ID
 * @param callback 回调函数 如果为promise为空
 * @param promise 如果存在promise,则callback为空
 */
exports.findSingleChatRoomByID = function (data) {

    //根据singleChatRoomID搜索对应聊天室的配置,如果存在则返回聊天室配置,否则返回false
    if (singleChatRoomConfigInstance == null) {
        singleChatRoomConfigInstance = data.db.getCollection('singleChatRoomConfig');
    }

    var deferred = Q.defer();
    console.log("[SingleChatRoomConfig->findSingleChatRoomByID]:开始根据聊天室ID查找配置数据!");
    //查询
    singleChatRoomConfigInstance.findOne({singleChatRoomID: data.singleChatRoomID}, function (error, result) {

        if (typeof data.promise != undefined) {
            if (!error) {
                data.result = result;
                //console.log(data);
                deferred.resolve(data);
            } else {
                deferred.reject(error);
            }
        }
        else {
            callback(error, data);
        }
        //db.dbClose();
    });

    return deferred.promise;

};

/**
 * @function 在聊天室配置集合中插入新的集合
 * @param singleChatRoomID
 * @param user_id_1
 * @param user_id_2
 * @param callback
 * @param promise
 */
exports.insertSingleChatRoomByID = function (data) {
    //根据singleChatRoomID搜索对应聊天室的配置,如果存在则返回聊天室配置,否则返回false
    if (singleChatRoomConfigInstance == null) {
        singleChatRoomConfigInstance = data.db.getCollection('singleChatRoomConfig');
    }

    var deferred = Q.defer();
    console.log("[SingleChatRoomConfig->insertSingleChatRoomByID]:开始插入数据!");
    //console.log(data);
    singleChatRoomConfigInstance.insert(
        {
            singleChatRoomID: data.singleChatRoomID,
            users: [data.user_id_1, data.user_id_2],
            msgCount: 0,
            createTime: currentDateTime
        }, function (error, result) {
            if (typeof data.promise != undefined) {
                if (!error) {
                    data.result = result;
                    deferred.resolve(data);
                } else {
                    deferred.reject(error);
                }
                //db.dbClose();
            }
            else {
                callback(error, result);
                //db.dbClose();
            }

        }
    );
    return deferred.promise;

};

(3)Test文件

/**
 * Created by apple on 2015/1/17.
 */
var singleRoomConfigModel = require('../SingleRoomConfigModel');
var model = require('../Model');
var db = require('../db/dbConfig');
var Q = require("q");

/**
 * @function 测试在singleChatRoomConfig中查询是否存在某个聊天室的配置记录,不存在则创建
 * @param singleChatRoomID
 */
/**CallBack风格的函数*/
function testFindAndInsertByID_CALLBACK(singleChatRoomID) {
    //执行查询操作的回调函数
    this.findSingleChatRoomByIDCallBack = function (error, result) {

        console.dir("findSingleChatRoomByIDCallBack invoked!" + result);

        //如果结果不为空,则查询所有未读信息
        if (result != null) {

        }
        else
        //如果结果为空,则建立一条新的数据返回未读信息条数为空
        {
            singleRoomConfigModel.insertSingleChatRoomByID(singleChatRoomID, 1, 2, this.insertSingleChatRoomByIDCallBack);
        }

    };
    //执行插入操作的回调函数
    this.insertSingleChatRoomByIDCallBack = function (error, result) {

        if (error != null) {
            console.log(result);
        }
        else {
            console.error(error);
        }

    };
    singleRoomConfigModel.findSingleChatRoomByID(singleChatRoomID, this.findSingleChatRoomByIDCallBack);
}

/**Promise风格的函数*/
function testFindAndInsertByID_PROMISE(singleChatRoomID) {

    var data = {
        singleChatRoomID: singleChatRoomID,
        promise: true,
        db:db
    };

    singleRoomConfigModel.findSingleChatRoomByID(data).then(
        /**
         * @function 逻辑判断层,聊天室存在则返回聊天室信息,否则进入聊天室创建
         * @param result
         */
        function (data) {
            var deferred = Q.defer();
            if(data) {
                //console.log("聊天室存在,输出聊天室配置!");
                deferred.resolve(data);
            }
            else{
                //console.log("聊天室不存在,开始创建聊天室!");
                //继续设置下一层的promise调用
                deferred.reject(data);
            }
            return deferred.promise;
        }
        , model.errorHandler
    ).then(
        function(data){
            //console.log("获取到了聊天室配置!");
            var deferred = Q.defer();
            deferred.resolve(data);
            return deferred.promise;
        },
        singleRoomConfigModel.insertSingleChatRoomByID
    ).done(
        function(data){
            //console.log("testFindAndInsertByID_PROMISE-完毕");
            //console.log(data);
            data.db.dbClose()
        },
        model.errorHandler
    );

}

testFindAndInsertByID_PROMISE("1");

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: