Функции Цепочки Не Работают Синхронно

#javascript #node.js #asynchronous #async-await #node-postgres

Вопрос:

Я запрашиваю базу данных следующим образом:

 const testMe = async () => {
    const index = await _fetchNextIndex()

    if (index === undefined) {
        throw new Error('Next index could not fetched')
    }

    return 'Success'
}


const _fetchNextIndex = async () => {
    return db.query("SELECT nextval(pg_get_serial_sequence('testme_table', 'id'))", (err, result) => {
        if (err) {
            throw new Error('Index could not generated')
        }
        return result.rows[0]
    })
}
 

db определяется как:

 const {Pool} = require('pg')
const pool = new Pool()

module.exports = {
    query: async (text, params, callback) => {
        return await pool.query(text, params, callback)
    }
}
 

Мой код не работает синхронно. index не определено, и возникает ошибка. Однако, когда я отлаживаю приложение, я вижу, что эта строка вызывается спустя некоторое время:

 return result.rows[0]
 

Чего мне не хватает?

ПРАВКА 1: Я добавил async и await в query функцию.

ПРАВКА 2: Я также удалил обратный вызов.

 const {Pool} = require('pg')
const pool = new Pool()

module.exports = {
    query: async (text, params) => {
        return await pool.query(text, params)
    }
}
 

Комментарии:

1. Ваш код не может работать синхронно, доступ к БД всегда асинхронен. Даже если вы ожидали, что он будет выполняться последовательно , ваша функция ничего не возвращает, а просто передает обратный query вызов . Не используйте обратные вызовы, используйте обещания, которые вы можете await pg даже поддерживайте их изначально!

2. Я не знаком с библиотеками, которые вы используете, но тот факт, что query требуется обратный вызов, заставил бы меня поверить, что он не возвращает обещание, которое решается с результатом.

3. Каждое async действие возвращает a Promise . Это асинхронный объект. Чтобы дождаться его завершения синхронно, вы можете использовать await pool.query(...); . await может использоваться только внутри async функции. В любом случае, db.query получает обратный вызов в качестве второго параметра, поэтому я думаю, что он все равно не будет синхронным. Проверьте, что предлагает @Bergi

4. Я добавил асинхронность и ожидание в функцию запроса, но тоже не сработало. Как я могу использовать обещания или как я могу использовать pg родной язык ? await PS: Я новичок в NodeJS.

5. » Я добавил асинхронность и ожидание в функцию запроса. «- теперь тоже снимай callback , и тебе хорошо идти. Смотрите примеры в документации pg.