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变成异步 无论是否有异步事件
回调函数如果有异步事件则为异步
没有异步事件则为同步执行