如何处理Java脚本中函数调用的异步性质

时间:2019-04-15 16:59:28

标签: javascript protractor

我正在创建一个函数,该函数将向我返回数据库查询的结果。问题是当我调用主函数时,主函数(getSessionCode)中的查询函数没有首先执行。 我尝试了Promise管理器方法以及回调,但这些方法似乎都不起作用。

代码:

dbConnectionObject = require('./DatabaseHandler.js');
  dbConnect = dbConnectionObject.getdatabaseConnection();
  var sessioncode;
  function getSessionCode(emailaddress){
      var queryBuild = "select <column name> from <table_name> where email="+ "\'"+ emailaddress +"\'";
      var responseArray;
      dbConnect.query(queryBuild,(err, res) =>{
      if(err)
          {
          console.log(err);
          }
      else if(res){ 
          responseArray=res.rows;`enter code here`
          dbConnect.end();       
          console.log(responseArray);
          return responseArray;
      }  
    });
  }
sessioncode = getSessionCode('gautam.pruthi@abc.com');
console.log(sessioncode);

1 个答案:

答案 0 :(得分:0)

由于dbConnect.query()使用回调模式来处理查询结果,因此该回调模式会阻止您直接将查询结果作为函数的返回值。

为解决此问题,Promise出来解决回调金字塔。

1)更改getSessionCode()以返回承诺
2)使用then()await模式消耗Promise最终值

dbConnectionObject = require('./DatabaseHandler.js');
dbConnect = dbConnectionObject.getdatabaseConnection();
var sessioncode;

function getSessionCode(emailaddress) {
    var queryBuild = "select <column name> from <table_name> where email=" + "\'" + emailaddress + "\'";
    var responseArray;

    return new Promise(function(resove, reject){

        dbConnect.query(queryBuild, (err, res) => {
            if (err) {
                console.log(err);
                reject(err);

            } else if (res) {
                responseArray = res.rows;
                `enter code here`
                dbConnect.end();
                console.log(responseArray);

                resove(responseArray);
            }
        });

    });
}

sessioncode = getSessionCode('gautam.pruthi@abc.com');

sessioncode.then((session)=>{
    console.log(session);
})

sessioncode = await getSessionCode('gautam.pruthi@abc.com');
console.log(sessioncode);