У меня возникают проблемы с Async / Await при попытке обработать мой MSSQL-запрос. Запрос работает нормально, потому что если я сделаю
console.info(sqltest.getNextId("A"))
Получаю ожидаемый результат. Но мне нужно дождаться результата первого запроса, чтобы перейти ко второму, поэтому я попробовал ниже. Я что-то здесь упускаю? Я хотел бы сохранить его как можно более чистым, потому что мне может потребоваться выполнить более 2 в последовательности.
async function someMethod() {
var newId = await sqltest.getNextId("A")
var nextId = await sqltest.updateId("A",newId)
console.info(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.info(newCounter)
return newCounter
}
)
.catch(err => {
console.info('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;
}
}
Что именно возвращает sqltest.getNextId("A")? Возвращает ли он значение? Обещание? Это асинхронно? Есть ли документация по API для getNextId() или, если это ваша функция, вы можете показать нам код для этого?
Те же вопросы для updateId(). Можем ли мы увидеть код или документ? await делает что-то полезное, когда вы ждете обещания. Он не делает ничего полезного практически в любых других обстоятельствах.
Вы все еще не показали сообщения об ошибках, которые получаете, или то, что происходит, вместо того, что вы ожидаете. С какой проблемой вы столкнулись?
Нет скрытой ошибки, она просто возвращает undefined - undefined для console.info
я имею в виду ... вы никогда ничего не возвращали ... конечно, он возвращается undefined.





There is no underhanded error it just returns undefined - undefined for the console.info
Этот комментарий на самом деле очень важен!
getNextId на самом деле ничего не возвращает, ни значение, которое вы ищете, ни обещание, что вы можете await. Причина, по которой вы видите вывод, заключается в том, что getNextId запускает console.info в обратном вызове then.
Но console.info(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.info(await getNextId("A")); // Should be what you expect.
Эта функция теперь имеет возвращаемое значение. Потому что теперь это async и есть оператор return, который не вложен в другую функцию. Теперь он возвращает Promise, который разрешается в newCounter и может быть вызван с помощью await.
Да, превращение моей функции в асинхронную функцию заставило ее работать нормально
Если регистрация
sqltest.getNextId("A")показывает ожидаемый результат (а неPromise), то я вообще не думаю, что это методaync. Какие сообщения об ошибках вы получаете? Что записывается в консоль?