Reputation: 15111
I'm looking to better understand the idea of async/await to avoid having nested .then() database calls. The following code simplified code will work correctly, but I have some instances where I would like to make multiple database calls in a row.
var sql = require("sqlite3").verbose();
var db = new sql.Database('db.sqlite');
async function query(sql) {
return new Promise((resolve, reject) => {
db.all(sql, [], (err, rows) => {
resolve(rows);
});
});
}
query('SELECT name FROM players')
.then(rows => console.log("Players are: ", rows.map(p => p.name).join(", ")));
How do I convert this to use async/await in an elegant manor?
Upvotes: 2
Views: 2271
Reputation: 342
var sql = require("sqlite3").verbose();
var db = new sql.Database('db.sqlite');
const query = async (sql) => {
let response;
await db.all(sql, [], (err,rows) => {
response = rows;
})
return response;
}
const getRows = async () => {
const rows = await query('SELECT name FROM players');
console.log("Players are: ", rows.map(p => p.name).join(", ")));
}
getRows();
or
const query = async (sql) => {
const [err, rows] = await db.all(sql, [])
return [err, rows];
}
async can't be in the global scope
Upvotes: 0
Reputation: 35491
To convert a promise chain like:
query('SELECT name FROM players')
.then(rows => console.log("Players are: ", rows.map(p => p.name).join(", ")));
Into async/await, you can do:
async function example() {
const rows = await query('SELECT name FROM players');
console.log("Players are: ", rows.map(p => p.name).join(", "));
}
Note: await
(currently) can only be used within an async
function, not globally.
Upvotes: 2