Да, есть.
Переходить на полностью async/await стэк, так, чтобы все функции которые что-то делают асинхронно, стали возвращать промисы, а не принимать callback для продолжения работы, например встроенный util.promisify умеет оборачивать классические error-first callback функции в функцию которая возвращает Promise.
Ну и любую асинхронную функцию можно завернуть в функцию которая вернет промис, в качестве примера:
const delay = (timeout) => new Promise(resolve => setTimeout(resolve, timeout));
Теперь в вашей асинхронной функции можно написать:
async function test() {
const db = new PGPool(config);
const data = await db.query(sql);
const { rows } = data;
console.log('data have received');
for(const row of rows) {
await delay(1e3);
console.log(row);
}
}
test().catch(console.error);
Те же самые ошибки ловятся в таком случае через try/catch. Единственное, что важно это всегда помнить какая функция вызывается, синхронная или асинхронная, чтобы не получить в итоге Unhandled promise rejection в production.
Опишите пожалуйста ситуацию, когда вы не можете использовать async/await?