Node.js 节点JS中的异步/等待失败
在尝试处理MSSQL查询时,我遇到了一些异步/等待问题。 查询工作正常,因为如果我这样做Node.js 节点JS中的异步/等待失败,node.js,Node.js,在尝试处理MSSQL查询时,我遇到了一些异步/等待问题。 查询工作正常,因为如果我这样做 console.log(sqltest.getNextId("A")) 我得到了预期的结果。但我需要等待第一个查询的结果传递到第二个查询,所以我在下面进行了尝试。我是不是错过了什么?我想保持它尽可能干净,因为我可能需要按顺序执行多于2个 async function someMethod() { var newId = await sqltest.getNextId("A") var nextId =
console.log(sqltest.getNextId("A"))
我得到了预期的结果。但我需要等待第一个查询的结果传递到第二个查询,所以我在下面进行了尝试。我是不是错过了什么?我想保持它尽可能干净,因为我可能需要按顺序执行多于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)
})
}
好的,这里是我的.stored过程代码,可以消除所有的混淆
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;
}
}
没有秘密错误,它只是返回undefined-console.log的undefined 这个评论其实是很重要的一点
getNextId
实际上不会返回任何内容,也不会返回您正在寻找的值,也不会返回您可以等待的承诺。您看到输出的原因是getNextId
在然后回调中运行控制台.log
但是console.log(sqltest.getNextId(“A”)
可能会抛出一个未定义的
由于sqlUtil.storedProcedure
似乎返回了一个承诺(因为您对其调用了then()
,所以您可以知道,您应该能够将其转换为异步函数,并在该函数上执行wait
)
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
,解析为newCounter
,如果记录sqltest.getNextId(“a”),则可以使用wait调用它
向您显示了预期的结果(而不是一个承诺
),那么我认为这根本不是一个aync
方法。您收到了什么错误消息?控制台上记录了什么?sqltest.getNextId(“a”)到底是什么
return?它返回值吗?承诺吗?它是异步的吗?是否有getNextId()的API文档
或者如果它是您的函数,您可以向我们展示用于该函数的代码吗?updateId()的相同问题
。我们可以查看代码或文档吗?Wait在您等待承诺时会做一些有用的事情。它在几乎任何其他情况下都不会做任何有用的事情。您仍然没有显示您收到的错误消息,或者显示正在发生的情况,而不是您预期的情况。您遇到的问题是什么?没有秘密错误st返回undefined-控制台的undefined.logYes将我的函数转换为异步函数使其工作正常