鍍金池/ 問(wèn)答/HTML/ ES6 異步函數(shù)返值問(wèn)題

ES6 異步函數(shù)返值問(wèn)題

類(lèi)中一成員函數(shù)
功能查詢(xún)數(shù)據(jù)并返回結(jié)果集

class DB 中
......
async Query(strSql)

{
    await this._conpool.request()
    .query(strSql, (err, result) => {
        console.dir(result.recordset);    //已查詢(xún)到數(shù)據(jù)在此
        return result.recordset;
    });
} 

調(diào)用
let db = new DB();

db.Query2('select * from sc_Product').then(ret => {

    console.dir(ret);
    res.json(ret);
}); 

一直得不到正確的數(shù)據(jù),前面打印看到Query函數(shù)查詢(xún)是正確的。
請(qǐng)教!

回答
編輯回答
陪妳哭

用promise封裝,你這個(gè)寫(xiě)法有點(diǎn)不倫不類(lèi),(順便一提 async 是ES7)

Query(strSql)
{
    return new Promise((resolve,reject)=>{
        this._conpool.request()
        .query(strSql, (err, result) => {
            if(err){
                //出錯(cuò)
                reject(err);
            }else{
                console.dir(result.recordset);    //已查詢(xún)到數(shù)據(jù)在此
                resolve(result.recordset);
            }
        });
    });
} 

調(diào)用:

    let db = new DB();
    db.Query('select * from sc_Product').then(ret => {
    
        console.dir(ret);
        res.json(ret);
    }).catch(e=>{
        //error
    }); 

或者

async function(){
    let db = new DB();
    try{
        let ret =await db.Query('select * from sc_Product');
        console.dir(ret);
        res.json(ret);
    }catch(e){
        //error
    }
}
    
await 用來(lái)wait的是一個(gè)promise(如果非promise會(huì)直接返回結(jié)果),而一個(gè)async函數(shù)的返回值實(shí)際上就是一個(gè)promise,所以他倆構(gòu)成一套以同步的方式書(shū)寫(xiě)異步代碼的語(yǔ)法。
任何異步的操作首先要封裝成promise才能用async/await這種語(yǔ)法糖。

從你的第一個(gè)函數(shù)里可以看出來(lái)你還不太懂promise的語(yǔ)法使用,建議找相關(guān)的博客研究一下

2017年9月15日 07:01