1.常见的回调,及使用
function test(callback) {
db.query(sql, values, function (err, result) {
if (err) {
callback(err, null)
} else {
callback(null, result)
}
})
}
//调用
test(function (err, date) {
if(err){
console.log(err)
}else{
console.log(date)
}
})
上面是常见的回调使用方法,初学node时,代码基本全是这样,当异步函数多的情况下就会感觉到,你会花很长时间都在理一个方法的回调到哪儿去了。
不是在写回调,就是在找回调
2.promise await async 优雅的写回调
function test() {
return new Promise(function (resolve, reject) {
db.query(sql, values, function (err, result) {
if (err) {
reject(err) //失败返回
} else {
resolve(result)//成功返回
}
})
})
}
//调用
(async function () {
try {
let a = await test()
console.log(a) //打印成功信息
} catch (err) {
console.log(err)//打印错误信息
}
})();
感觉是不是优雅了许多,没有以前抓狂的感觉了,以下说几点注意:
- 回调方法要用Promise包裹起来,await后要跟promise对象;
- 只有在async方法里面才能使用await操作符;
可是感觉上面的例子还是不够优雅,mysql的执行方法还是callbak,接下来我们就消灭callback
callback写法
let query=function(sql,options,callback){
pool.getConnection(function(err,conn){
if(err){
console.log(err)
callback(err,null,null);
}else{
conn.query(sql,options,function(err,results,fields){
//释放连接
conn.release();
//事件驱动回调
callback(err,results,fields);
});
}
});
};
优雅的写法
let query=function(sql,options){
return new Promise(function (resolve, reject) {
pool.getConnection(function(err,conn){
if(err){
console.log(err)
reject(err);
}else{
conn.query(sql,options,function(err,results,fields){
//释放连接
conn.release();
//事件驱动回调
resolve(results);
});
}
});
})
};
//改进 test()方法
function test() {
return new Promise(async function (resolve, reject) {
try{
let a= await db.query(sql, values)
resolve(a)
}catch(err){
reject(err)
}
})
}
没有callback,轻松解决各种回调,想咋调咋调,await async你值得拥有