首页 > 解决方案 > 如何在 Java Script 中处理函数调用的异步性质

问题描述

我正在创建一个函数,它将返回数据库查询的结果。问题是当我调用主函数时,主函数(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);

标签: javascriptprotractor

解决方案


因为dbConnect.query()使用回调模式来处理查询结果,所以这个回调模式阻止你直接将查询结果作为你的函数返回值。

为了解决这个问题,Promise出来解决回调金字塔。

1) 更改getSessionCode()为返回 Promise
2) 使用then()orawait模式使用 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);

推荐阅读