Ошибка Async / Await в Node JS

У меня возникают проблемы с 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") показывает ожидаемый результат (а не Promise), то я вообще не думаю, что это метод aync. Какие сообщения об ошибках вы получаете? Что записывается в консоль?

Alex Wayne 26.10.2018 23:25

Что именно возвращает sqltest.getNextId("A")? Возвращает ли он значение? Обещание? Это асинхронно? Есть ли документация по API для getNextId() или, если это ваша функция, вы можете показать нам код для этого?

jfriend00 26.10.2018 23:34

Те же вопросы для updateId(). Можем ли мы увидеть код или документ? await делает что-то полезное, когда вы ждете обещания. Он не делает ничего полезного практически в любых других обстоятельствах.

jfriend00 26.10.2018 23:43

Вы все еще не показали сообщения об ошибках, которые получаете, или то, что происходит, вместо того, что вы ожидаете. С какой проблемой вы столкнулись?

Alex Wayne 27.10.2018 00:10

Нет скрытой ошибки, она просто возвращает undefined - undefined для console.info

MisterniceGuy 27.10.2018 00:11

я имею в виду ... вы никогда ничего не возвращали ... конечно, он возвращается undefined.

Kevin B 27.10.2018 00:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Да, превращение моей функции в асинхронную функцию заставило ее работать нормально

MisterniceGuy 27.10.2018 00:38

Другие вопросы по теме