[英]Don't understand this async await call with axios
我正在使用节点10+,并且具有此函数,在该数据库中执行数据库查询,然后等待结果并返回:
var test3 = (req,res,query) => {
var conn = new sql.ConnectionPool(dbconfig);
var req = new sql.Request(conn);
var result;
return conn.connect().then(async() => {
result = await req.query(query);
conn.close();
return result;
}).catch(e => {
return e;
}).finally(() => {
conn.close();
});
}
首先,我想知道为什么我必须返回conn.connect()块。
return conn.connect().then(async() => {...
我知道这与我认为的诺言链有关,但是我不明白为什么,因为我的异步db调用已经从await dbcall函数中解决了……我只是从函数内部返回结果
然后,我有一个路由器,我在这里调用api函数:
router.get("/api/compareCount", function(req,res) {
var query = `SELECT COUNT(*) as count
FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(day,-1,getdate())`;
var query2 = `SELECT COUNT(*) as count
FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(hour,-8,getdate())`;
var query3 =`SELECT COUNT(*) as count
FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch]`;
axios.all([searchES(req,res), test3(req,res,query), test3(req,res,query2) , test3(req,res,query3)])
.then(axios.spread(function (esCount, mssqlCount1, mssqlCount2, mssqlCount3) {
totalES = esCount.hits.total;
totalMSSQL = mssqlCount1.recordset[0].count;
totalMSSQL2 = mssqlCount2.recordset[0].count;
totalMSSQL3 = mssqlCount3.recordset[0].count;totalMSSQL, " mssqlCount2: ", totalMSSQL2, "mssqlCount3: ", totalMSSQL3);
var msg = "ES Dokumente total: " + totalES + " MSSQL Dokumente total: " + totalMSSQL + "<br>";
if ( totalES != totalMSSQL) {
msg += "Critical: " + totalES != totalMSSQL + "<br>";
} if ((totalES != totalMSSQL2)) {
msg += "Warning: " + (totalES != totalMSSQL2) + "<br>";
} if ((totalES > totalMSSQL3)) {
msg += "Achtung es gibt ungelöschte Dokumente im Elasticsearch Index!";
}
res.set('Content-Type', 'text/html');
res.send(msg);
})).catch((err) => {
res.send(err);
});
})
router.get("/api/test3", async function (req,res) {
var query = `SELECT COUNT(*) as count
FROM [DublettenReferenzmenge].[dbo].[DocumentForElasticsearch] where lastChange < dateadd(day,-1,getdate())`;
var result = await test3(req,res,query);
res.json(result);
})
api / test3路由照常向我返回结果,但是api / compareCount也确实向我返回了正确的结果...
此外,我必须使用async函数... await test3(..)async-await语法结构来将我的结果解析为一个变量...但是我上面的api / compareCount函数不必使用相同的结构,结果无论如何都会在.then(axios.spread(function(...)))
。 这是为什么? 我很困惑,因为我真的不知道Promise链接和调用的内部工作原理...
编辑:在我的test3()函数之前,我有这样的事情:
async function testQuery(query) {
try {
let pool = await sql.connect(dbconfig);
let result1 = await pool.request()
//.input('input_parameter', sql.Int, value)
.query(query);
sql.close();
return result1;
} catch (err) {
console.log(err);
sql.close();
} finally {
sql.close();
}
};
我也获得了该函数的结果,但是,我遇到了某种竞争状况,它告诉我sql-连接已经存在,并且如果我重新加载页面的速度太快,请首先执行sql.close()……我不明白这与test3()函数不再...
首先, test3()
需要返回一个Promise,以便调用者知道何时完成以及是否有错误。 使用async / await可能最简单:
async function test3(query) => {
const conn = new sql.ConnectionPool(dbconfig);
const request = new sql.Request(conn);
await conn.connect();
try {
const result = await request.query(query);
return result;
} finally {
conn.close();
}
}
各种变化:
await
来简化异步逻辑流程 var
切换到const
。 async
以便在完成内部操作或发生错误时返回挂钩的promise 然后,如果您调整调用test3()
方式以仅传递查询参数(因为已使用了所有参数),则在其他地方使用该函数都应该起作用。
您的代码正在执行此操作:
var result = await test3(req,res,query);
但是, test3()
没有返回值,因此await
没有任何作用。 await
使用一个promise进行工作,而您没有返回与test3()
内部的异步操作链接的promise。 这就是我上面所做的更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.