需要保持承诺的结果会产生一个变量用于 Nodejs mssql 验证


    let RetrieveFromDb=(queryStr) =>
{
    let sql=require('mssql');
    let config={
        server:'127.0.0.1',
        database:'TestDB',
        user:'user',
        password:'user',
    };
    let dbConn=new sql.Connection(config);
    return dbConn.connect().then(function (){
        let request=new sql.Request(dbConn);
        return request.query(queryStr)
        .then(function(recordset)
        {
            return recordset;
            dbConn.close();
        }).catch(function (err) {
            console.log(err);
            dbConn.close();
        });
    }).catch(function (err)  {
        console.log(err);
    });
};

RetrieveFromDb("Select FirstName from User where UserID='1'").then(function(x){console.log(x[0].FirstName);});//console is displying the FirstName value from DB
RetrieveFromDb("Select FirstName from User where UserID='1'").then(res=>{console.log(res[0].FirstName)});//console is displying the FirstName value from DB

上面的两个函数调用将值返回到控制台,但我想将 RetrieveFromDb(( 的结果保留到一个变量中,以便我可以与其他数据进行比较以进行验证。

假设 var actualFirstname=RetrieveFromDb(myquery);,那么我将比较if(actualFirstname===expectedFirstName)与否。

承诺是一种代码同步方法,因此您必须将其操作视为异步,并使用在承诺解析时获得的值。没有办法:

var actualFirstName = RetrieveFromDb(myquery);
actualFirstName === expectedFirstName;

相反,您必须在承诺解决时进行比较:

RetrieveFromDb(myquery).then(data => {
  data.actualFirstName === expectedFirstName;
});

谢谢大家,我兜圈子好几天,试图了解代码的异步性质。 对我来说,灯泡时刻是你必须将变量值设置为回调/承诺堆栈的一部分(即在函数中分配它(我的背景是Excel,VBA,Sequel Server,PHP oop,C#。 在所有这些语言中,函数是运行一段谨慎的代码并返回一个值的东西,然后该值被分配给等式左侧的对象。

function myFunc(){ return 'Hello World'}
var myvar =   myFunc() // sets myvar to 'Hello World'
在节点上的土地

上,您必须在函数执行分配

function myFunc(){ myvar = 'Hello world'}

因此,要从数据库中获取数据:

fetchFromDB('Select top 10 * from x',(err,res) =>{ myvar1 = res})
fetchFromDB('Select top 10 * from Y',(err,res) =>{ myvar2 = res})

最新更新