尝试处理我的MSSQL查询时,我在Async / Await中遇到一些问题。 该查询工作正常,因为如果我这样做
console.log(sqltest.getNextId("A"))
我得到了预期的结果。但是我需要等待第一个查询的结果传递给第二个,所以我在下面尝试了。我在这里想念什么吗?我想保持它尽可能干净,因为我可能需要在Sequence中执行大于2的操作。
async function someMethod() {
var newId = await sqltest.getNextId("A")
var nextId = await sqltest.updateId("A",newId)
console.log(newId + ' - ' + nextId)
}
someMethod()
这是我的getNextId的样子
const getNextId = (counter_id) =>
{const params = [{ name: "p_counter_id", type: sql.VarChar(10), value: counter_id }]
sqlUtil
.storedProcedure(params, "sp_counter_sel")
.then(result =>
{
var newCounter = sequence
(
result.recordset[0].next_id,
result.recordset[0].counter_length,
result.recordset[0].counter_fill
)
console.log(newCounter)
return newCounter
}
)
.catch(err => {
console.log('Error: ' + err.message)
})
}
好的,消除所有混乱,这是我的.storedProcedure代码
let storedProcedure = async (params, storedProcedureName) => {
const pool = await getOrCreatePool()
let request = await pool.request()
params.forEach((parameter) => {
parameterDirection = parameter.isOutput ? 'output' : 'input';
request = request[parameterDirection](parameter.name, parameter.type, parameter.value)
})
try {
return await request.execute(storedProcedureName)
sql.on('error', err => {
})
} catch(err) {
let message = {
message: {
msg: err.message,
number: err.number
},
}
throw message;
}
}
答案 0 :(得分:2)
没有人为错误,它只会返回undefined-console.log未定义
此评论实际上是重要的一点!
getNextId
实际上不会返回任何内容,不是您要查找的值,也不是您可以await
的承诺。您看到输出的原因是getNextId
在console.log
回调中运行then
。
但是console.log(sqltest.getNextId("A"))
可能会吐出undefined
由于sqlUtil.storedProcedure
似乎返回了一个承诺(您可以说是因为您在其上调用了then()
,因此您应该能够将其转换为异步函数,并在其上转换await
。
const getNextId = async (counter_id) => {
const params = [{
name: "p_counter_id",
type: sql.VarChar(10),
value: counter_id
}]
const result = await sqlUtil.storedProcedure(params, "sp_counter_sel")
var newCounter = sequence(
result.recordset[0].next_id,
result.recordset[0].counter_length,
result.recordset[0].counter_fill
)
return newCounter
}
console.log(await getNextId("A")); // Should be what you expect.
此函数现在有一个返回值。因为它现在是async
,并且具有一个return
语句,该语句未嵌套在另一个函数中。现在,它返回一个解析为Promise
的{{1}},可以用newCounter
来调用。