promise封装数据库请求与http请求

这里写自定义目录标题


封装数据库

function queryPromise(sql){
    return new Promise( (resolve,reject)=>{
        pool.getConnection(function (err, conn) {
            if(!err){
                conn.query(sql, function (qerr, vals, fields) {
                    //释放连接  
                    conn.release();   
                    if(qerr){
                        reject(qerr);
                    }else{
                        //resolve(null, vals);
                        resolve(vals);
                    }
                });
            }else{
                reject(err);
            }
        })
    })
    // .catch(qerr=>{   
    //     return {
    //         err: qerr,
    //         data: null
    //     };
    // });
}

调用数据库请求

exports.create_room = async function (roomId, conf, ip, port, create_time, gps_limit, teamId) {
    // callback = callback == null ? nop : callback;
    var sql = "INSERT INTO t_rooms(uuid,id,base_info,ip,port,create_time,gps_limit,teamId) \
                VALUES('{0}','{1}','{2}','{3}',{4},{5},{6},{7})";
    //时间+日期生成uuid
    var uuid = Date.now() + roomId;
    var baseInfo = JSON.stringify(conf);
    sql = sql.format(uuid, roomId, baseInfo, ip, port, create_time, gps_limit,teamId);   
    try{
        await queryPromise(sql);
        return uuid;
    }catch(e){
        console.log(e)
        return null;
    }
    //如果不使用async函数可以返回promise对象,在promise()的执行过程中会等待直到resolv或reject执行
    // return new Promise((resolve,reject)=>{
    //     try{
    //         queryPromise(sql).then(data=>{
    //             return uuid  如果在这返回而不使用resolve .then方法则会被当成异步方法执行
    //             resolve(uuid);
    //         })
    //     }catch(e){
    //         console.log(e)
    //         reject(e);
    //     }
    // })
};

封装http get请求

exports.get2 = function (url1, data, safe) {
	return new Promise((resolve, reject) => {
		var content = qs.stringify(data);
		var url = url1 + '?' + content;
		var proto = http;
		if (safe) {
			proto = https;
		}
		var req = proto.request( url,function (res) {
			// console.log('STATUS: ' + res.statusCode);  
			// console.log('HEADERS: ' + JSON.stringify(res.headers)); 
			let respose = "";
			res.setEncoding('utf8');
			res.on('data', function (chunk) {
				// console.log('BODY: ' + chunk);
				//var json = JSON.parse(chunk);
				//callback(true,json);
				respose += chunk;
			});
			res.on('end', function () {//modify by zz解决数据量过大,导致解析JSON报错
				var json = JSON.parse(respose);
				resolve(json);   //resolve方法在回调函数中,所以promise会等待回调函数先执行
				//reject(1)
			})
		})
			req.on('error', function (e) {
				console.log('problem with request: ' + e.message);
				reject(e)
				// callback(false, e);
			});
			req.end();
	})

}

测试例子

function bb(){
    return new Promise((resolve,reject)=>{
        resolve()
    })
}
function aa(){
    return new Promise((resolve,reject)=>{
        bb().then(()=>{
            resolve(1)
            console.log(4)
        })
        console.log(3)
    })
}
async function cc(){
    var gg=  await bb().then(()=>{
        console.log(6)
        return 7
    })
    console.log(gg)
    console.log(5)  
}
aa().then((data)=>{
    console.log(data)
})
cc().then((data)=>{
    console.log(data)
})
console.log(2)

aa()执行 bb().then为异步 先打印3 cc()为阻塞执行 打印2
bb().then 和aa.then() 都为异步执行 所以先打印4在打印1
await bb.then 和 console.log(gg) 和 console.log(5) 为顺序打印 await用法改变事件执行顺序
https://segmentfault.com/q/1010000015268791https://segmentfault.com/q/1010000015268791
46175为什么是这个顺序还需继续学习

js异步事件有http请求 数据库请求 读取文件
而promise会将.then变成异步 无论是否有异步事件
回调函数如果有异步事件则为异步
没有异步事件则为同步执行

你可能感兴趣的:(js)