Как убедиться, что моя асинхронная функция выполняется в первую очередь перед вызовом следующей функции

1

Моя программа должна анализировать результаты 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");
		}
	});
}

Я пробовал читать как можно больше о асинхронных вызовах, и я чувствую, что хорошо понимаю, для чего они используются, но я пришел, пытаясь решить мою конкретную проблему.

  • 0
    Код, который вы показываете, не должен даже работать. connectSQL возвращает Promise, а Promise не имеет свойства Records . Вы просто упускаете await где-то (что также решит вашу первоначальную проблему).
Теги:
async.js

2 ответа

4
Лучший ответ

Асинхронные функции возвращают 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);
}
  • 3
    Вы можете преобразовать первую функцию в просто connectSQL().then(writeToCSV)
  • 0
    @ Туффи Хорошее дополнение! Я решил оставить функцию стрелки видимой, потому что менее опытному программисту Javascript может быть более ясно видеть передаваемый параметр.
Показать ещё 2 комментария
1

Если предположить, что ваш код работает в среде, где работает функция асинхронная, то я думаю, что все, что вам нужно сделать, это добавить await перед вызовом connectSQL внутри dataRefresh как так:

async function dataRefresh(){
    var resu = await connectSQL();
    writeToCSV(resu);
}
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню