【问题标题】:How to ensure my async function executes first before calling next function如何确保我的异步函数在调用下一个函数之前首先执行
【发布时间】:2018-01-09 03:16:07
【问题描述】:

我的程序应该将 SQL 查询的结果解析为 CSV 文件,然后保存到 FTP 和 S3 存储桶。 connectSQL 是一个异步函数,需要在调用 writeToCSV 函数之前完全执行,但到目前为止,无论我尝试过什么,writeToCSVconnectSQL 之前执行,给了我一个空的 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");
		}
	});
}

我已尝试尽可能多地阅读有关异步调用的信息,并且我觉得我对它们的用途有很好的了解,但我试图解决我的具体问题却一无所获。

【问题讨论】:

  • 您显示的代码甚至不应该工作。 connectSQL 返回一个 Promise,而 Promise 没有 Records 属性。您只是在某处缺少await(这也可以解决您原来的问题)。

标签: javascript node.js async.js


【解决方案1】:

Async functions 返回一个 Promise 解析为函数的返回值。您可以将其视为一个承诺并使用.then(),也可以将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)
  • @Touffy 很好的补充!我决定让箭头函数可见,因为对于经验不足的 Javascript 程序员来说,可能更清楚地看到传入的参数。
  • 很公平。当然,这同样适用于将第二个函数重写为writeToCSV(await connectSQL()) ;)
  • 非常感谢!我使用了@Touffy 的建议,它奏效了。我会更多地研究承诺
【解决方案2】:

假设您的代码在异步函数工作的环境中运行,那么我认为您需要做的就是在对 connectSQL 的调用前面添加 await dataRefresh ,如下所示:

async function dataRefresh(){
    var resu = await connectSQL();
    writeToCSV(resu);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多