Я пытаюсь получить некоторые данные из базы данных с помощью async/await, затем создаю объект с некоторыми данными и вставляю их в базу данных. Мне нужно, чтобы вызовы были синхронными для этого, чтобы отправлять полные данные для вставки. У меня есть асинхронная функция, но ожидание не работает...
Код ниже:
async function queryDb(roleName) {
let pool = await sql.connect(dbConfig);
let data = await pool.request()
.query(`select id from table where name='${roleName}'`);
roleId = data.recordset[0].id;
pool.close;
sql.close;
return roleId;
}
queryDb(roleId)
.then(result => {
console.info(result);
})
.catch(err => {
pool.close;
sql.close;
console.info(err)
})
async function program() {
const xlsxFile = require('read-excel-file/node');
xlsxFile('./file.xlsx').then((rows) => {
let roleid = await queryDb(rows[0][1]); // here is not working
let insretObj = {
field1: rows[0][0],
field2: rows[1][1],
field3: rows[2][2],
field4: rows[3][3],
field5: rows[4][4],
field6: rows[5][5],
role_id: roleid,
};
assignRoles(insretObj);
});
};
program().then(console.info('hereeeeeee'));
Я очень ценю ваш ответ.
Кроме того, в чем смысл pool.close
и sql.close
? Это должны быть вызовы функций, которые вы на самом деле вызываете, как в pool.close()
и sql.close()
?
@ jfriend00 Я использую mssql. а что касается другого, да, я полагаю, они одинаковы.
Они не одинаковы. Утверждение вроде pool.close
ничего не делает.
@ jfriend00 это связано с моей проблемой? ожидание не работает внутри функции программы
Нет, это, вероятно, не связано с этой проблемой, но позже это вызовет другую проблему.
Где в вашем комментарии написано "здесь не работает", что именно означает "не работает"? Что именно вы наблюдаете? Что именно вы ожидаете или хотите, чтобы поведение было другим?
@ jfriend00 показывает эту ошибку «ожидание допустимо только в асинхронной функции». Я за исключением того, чтобы получить здесь roleId и создать объект ниже с этим идентификатором роли.
.then(async (rows) => {
.. не забывайте использовать try/catch при использовании async/await
он показывает эту ошибку «ожидание допустимо только в асинхронной функции». Я за исключением того, чтобы получить здесь roleId и создать объект ниже с этим идентификатором роли.
Вы используете await
внутри вложенного обратного вызова обработчика .then()
, который сам по себе не является async
.
В общем, вы не хотите смешивать .then()
и await
в одном и том же потоке управления. Я бы посоветовал вам изменить его на это:
const xlsxFile = require('read-excel-file/node');
async function program() {
let rows = await xlsxFile('./file.xlsx');
let roleid = await queryDb(rows[0][1]);
let insretObj = {
field1: rows[0][0],
field2: rows[1][1],
field3: rows[2][2],
field4: rows[3][3],
field5: rows[4][4],
field6: rows[5][5],
role_id: roleid,
};
assignRoles(insretObj);
}
Какую библиотеку вы используете для доступа к sql? Поддерживает ли он обещания?