Моя программа должна анализировать результаты SQL-запроса в CSV файл, а затем сохранять в ведомости FTP и S3. connectSQL
- это функция async, которая должна выполняться полностью перед вызовом функции writeToCSV
, но до сих пор, независимо от того, что я пробовал, writeToCSV
выполняется перед connectSQL
, предоставляя мне пустой CSV файл. Как я могу убедиться, что connectSQL
выполняется раньше всего?
function dataRefresh(){
var resu = connectSQL();
writeToCSV(resu);
}
async function connectSQL(){
try {
const sqlConfig = {
// db connection config
};
const sqlQuery = "SELECT * FROM " + table;
let pool = await sql.connect(sqlConfig);
let result = await pool.request().query(sqlQuery);
return result;
} catch(err){
throw err;
}
}
function writeToCSV(event){
// Parse to CSV
var csv = parser({data: event.Records, fields: fields});
// Write CSV to local directory
fs.writeFile(fileName, csv, function(err){
if (err){
throw err;
} else{
console.log("Data saved locally");
}
});
}
Я пробовал читать как можно больше о асинхронных вызовах, и я чувствую, что хорошо понимаю, для чего они используются, но я пришел, пытаясь решить мою конкретную проблему.
Асинхронные функции возвращают Promise
для возврата к возвращаемому значению функции. Вы можете рассматривать это как обещание и использовать .then()
, или также dataRefresh
async dataRefresh
и использовать await
:
function dataRefresh(){
connectSQL().then(result => writeToCSV(result));
// or simply:
// connectSQL().then(writeToCSV);
}
или же
async function dataRefresh(){
var result = await connectSQL();
writeToCSV(result);
}
connectSQL().then(writeToCSV)
Если предположить, что ваш код работает в среде, где работает функция асинхронная, то я думаю, что все, что вам нужно сделать, это добавить await
перед вызовом connectSQL
внутри dataRefresh
как так:
async function dataRefresh(){
var resu = await connectSQL();
writeToCSV(resu);
}
async
.
await
может использоваться только внутри async
функций :)
connectSQL
возвращает Promise, а Promise не имеет свойстваRecords
. Вы просто упускаетеawait
где-то (что также решит вашу первоначальную проблему).