es6 promise 异步方法处理

本文介绍JavaScript中处理异步操作的方法,包括使用回调、Promise、async/await等技术,并提供了基于ES6的异步请求示例。此外,还详细介绍了如何使用Promise进行并发请求,以及通过Promise包装实现MongoDB数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在js中,凡是涉及到非内存的操作都为异步操作。如读写磁盘文件,访问url请求,读写数据库数据等都为异步操作。

2.在es6之前我们最常见对于异步的处理就是书写大量的callback函数,所以当你的下一步数据需要依赖于上一步异步操作的数据时,会出现很多嵌套,代码凌乱的感觉。这种后果就是你不会知道你的callback是在哪,并且如果报错也很难处理.这是我以前写的代码.

exports.get_charge_info = function (userid, orderno, callback) {
	callback = callback == null ? nop : callback;
	if (userid == null || orderno == null) {
		callback(null);
	}
	var sql = "SELECT * FROM game_db.t_users_rechange_record WHERE userid = {0}  AND  orderno = '{1}';";
	sql = sql.format(userid, orderno);
	console.log("查询语句是:" + sql);
	query(sql, function (err, rows, fields) {
		if (err) {
			callback(null);
			throw err;
		} else {
			if (rows.length == 0) {
				callback(null);
				return;
			}
			callback(rows[0]);
		}
	});
};

3.在es6里面,为我们提供了一个Promise类.你可以理解为一个对象,包含进行态和完成态两部分。其中完成态分为失败态和成功态。我们可以把处理完的数据,若成功则放在成功态,失败则放在失败态。具体包装如下:

     * @version 1.0 get promise请求包装
     * 
     */
    static async get({ url, data }) {

        //resolve 完成态, reject 失败态
        return await new Promise(
            (resolve, reject) => {

                //get为异步操作 .then 后面的为执行完请求后 返回的数据的回调函数
                axios.get(url, { params: data }).then((response) => {

                    resolve(response);

                }).catch((err) => {

                    reject(err);

                });

            }
        );

    }


4. async 和 await 是搭配在一起使用的. 如果不写await则不会等待异步操作。

5.多条请求并发 可用promise.all解决,回来的结果会是一个数组,若其中一个请求失败,则不会返回任何数据,如下:

Promise.all([axios.get({ url: 'http://es6.ruanyifeng.com/#docs/set-map' }), axios.get({ url: 'http://es6.ruanyifeng.com/#docs/reflect' })])

    .then(() => {

        console.log('结束时间:' + new Date().getTime());

    }).catch((err) => {

        console.log(err);
    });

6.mongodb 包装处理代码 第一段是对数据库操作的处理,第二段是怎样连接数据库,实现了连接池。

/**
 * @version 1.0 mongoDB 管理
 * 
 */
const path = require('path');

const mongoClient = require('./mongoClient.js').MongoClientMannage;

const ObjectId = require('mongodb').ObjectId;

const log = require(path.join(__dirname, '../', '../', 'lib', 'log.js')).log;

class MongoDBUtil {


    /**
     * @version 1.0 插入文档(包含)
     * @param collection 文档名
     * @param data 插入数据
     * @return ids  返回插入对应的id名
     */
    static async insertDoc({ collection, data }) {

        let db = mongoClient.getCoon();

        if (db) {
            return await new Promise(

                (resolve, reject) => {

                    let dbCollection = db.collection(collection);

                    dbCollection.insert(data, (err, result) => {

                        if (err) {
                            log.error('MongoDBUtil:insertDoc ' + err);
                            reject(err);
                        }
                        //result.ops[0]._id
                        resolve(result);
                    });
                }

            );
        }
        return false;
    }


    /**
     * @version 1.0 查找文档
     * @param collection 文档名
     * @param searchStr 搜索条件
     * @param fields 指定字段返回
     * @return result 搜索结果/false为未查找到
     */
    static async findDoc({ collection, searchStr, fields = {} }) {

        let db = mongoClient.getCoon();

        if (db) {

            return await new Promise(

                (resolve, reject) => {

                    let dbCollection = db.collection(collection);

                    if (searchStr) {
                        if (searchStr._id) {

                            if (searchStr._id instanceof Object) {

                                if (searchStr._id.$in) {

                                    for (let i = 0; i < searchStr._id.$in.length; i++) {

                                        searchStr._id.$in[i] = ObjectId(searchStr._id.$in[i]);

                                    }

                                }
                            } else {
                                searchStr._id = ObjectId(searchStr._id);
                            }

                        }
                    }


                    dbCollection.find(searchStr, fields).toArray(

                        (err, result) => {

                            if (err) {
                                log.error('MongoDBUtil:findDoc' + err);
                                reject(err);
                            }

                            resolve(result);

                        }

                    );

                }
            );
        }

        return false;

    }

    /**
     * @version 1.0 聚合查询
     */
    static async queryDoc({ collection, searchStr }) {

        let db = mongoClient.getCoon();

        if (db) {

            return await new Promise(

                (resolve, reject) => {

                    let dbCollection = db.collection(collection);

                    if (searchStr && searchStr.length > 0 && searchStr[0].$match && searchStr[0].$match._id) {

                        searchStr[0].$match._id = ObjectId(searchStr[0].$match._id);
                    }

                    dbCollection.aggregate(searchStr).toArray(

                        (err, result) => {

                            if (err) {
                                log.error('MongoDBUtil:queryDoc' + err);
                                reject(err);
                            }

                            resolve(result);

                        }

                    );

                }
            );
        }

        return false;
    }


    /***
     * @version 1.0 根据条件来进行统计
     * 
     */
    static async countDocs({ collection, searchStr = {} }) {

        let db = mongoClient.getCoon();

        if (db) {

            return await new Promise(

                (resolve, reject) => {

                    let dbCollection = db.collection(collection);

                    if (searchStr._id) {

                        searchStr._id = ObjectId(searchStr._id);

                    }

                    dbCollection.count(searchStr,

                        (err, result) => {

                            if (err) {
                                log.error('MongoDBUtil:countDocs' + err);
                                reject(err);
                            }

                            resolve(result);

                        }

                    );

                }
            );
        }

        return false;

    }

    /**
     * @version 1.0 更新文档
     * @param collection 文档名
     * @param searchStr 搜索条件
     * @param updateStr 更新条件
     * @return flag true为更新成功  false 为未更新成功
     */
    static async updateDoc({ collection, searchStr, updateStr }) {


        let db = mongoClient.getCoon();

        if (db) {

            return await new Promise((resolve, reject) => {

                let dbCollection = db.collection(collection);

                if (searchStr._id) {

                    searchStr._id = ObjectId(searchStr._id);
                }


                dbCollection.update(searchStr, updateStr, (err, result) => {

                    if (err) {
                        log.error('MongoDBUtil:updateDoc' + err);
                        reject(err);
                    }
                    if (result.result.n > 0) {
                        resolve({ flag: true });
                    } else {
                        resolve({ flag: false });
                    }


                }

                );

            });

        }

        return false;

    }



    /**
     * @version 1.0 删除文档 
     * @param collection 文档名
     * @param searchStr 需删除的条件名
     * @return flag true为成功 false为失败
     * 
     */
    static async deleteDoc({ collection, searchStr }) {

        let db = mongoClient.getCoon();

        if (db) {

            return await new Promise((resolve, reject) => {

                let dbCollection = db.collection(collection);

                dbCollection.remove(searchStr, (err, result) => {

                    if (err) {
                        log.error('MongoDBUtil:deleteDoc' + err);
                        reject(err);
                    }
                    if (result.result.n > 0) {
                        resolve({ flag: true });
                    } else {
                        resolve({ flag: false });
                    }


                }

                );

            });

        }

        return false;

    }

}

// mongoClient.createConn().then(

//     () => {


//         let m = new MongoDBUtil();

//         //插入操作示例
//         // let user = [{ 'userName': 'zjx6', 'age': 11 }, { 'userName': 'zjx7', 'age': 12 }];
//         // m.insertDoc({ collection: 'xmj_users', data: user });

//         //查找操作示例
//         //  let searchStr = {'_id':'59eef0741bd3f0d6255c9362'};
//         //  m.findDoc({collection:'xmj_user', searchStr});

//         //更新操作示例  !!请注意 $set 若不写则为直接覆盖
//         // let searchStr = { 'userName': 'zj6' };
//         // m.updateDoc({ collection: 'xmj_user', searchStr, updateStr: { $set: { 'age': 22 } } });

//         //删除操作示例
//         // let searchStr = { 'userName': 'zjx6' };
//         // m.deleteDoc({ collection: 'xmj_user', searchStr });


//     }

// );

module.exports = { MongoDBUtil, };

/**
 * @version 1.0 创建客户端
 * 
 */
const path = require('path');

const MongoClient = require('mongodb').MongoClient;

const logger = require(path.join(__dirname,'../','../','lib','log.js')).log;

let MongoDBConn = [];


/**
 * @version 1.0 mongoclient 客户端管理
 * 
 */
class MongoClientMannage {


    static async createConn(mongoCluster) {

        for (let i = 0; i < mongoCluster.length; i++) {

            let res = await new Promise(
                (resolve, reject) => {
                    MongoClient.connect(mongoCluster[0].url,
                        {
                            server: {
                                poolSize: 5,
                                socketOptions: { connectTimeoutMS: 10000 },
                                auto_reconnect: true
                            },
                            replSet: {},
                            mongos: {}
                        }, (err, db) => {
                            if (err) {
                                logger.error('连接mongo失败:'+mongoCluster[0].url);
                                reject(err);
                            } else {
                                logger.info('连接mongo成功:'+mongoCluster[0].url);
                                resolve(db);
                            }
                        });
                }

            );
            MongoDBConn.push(res);
        }
    }


    /**
     * @version 1.0 返回一个可用的mongo数据库连接
     * 
     */
    static getCoon() {

        if (MongoDBConn.length == 0) {

            return false;

        } else {

            //返回任一一个连接
            return MongoDBConn[Math.floor(Math.random() * MongoDBConn.length)];
        }
    }

}


module.exports = {MongoClientMannage,};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值