promise await async解决node回调

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你值得拥有

你可能感兴趣的:(promise await async解决node回调)