我有一些node.js代码,它在循环中从api获取数据,并运行多个mysql查询来更新一些行。
我遇到的问题是,脚本一直在运行,直到我用终止mysql连接为止 connection.end()
. 我是异步代码的新手。我在哪里调用终止函数,以便在所有查询执行完毕时执行它?什么是合适的设计模式?瀑布有什么好处吗?
这是我目前拥有的代码片段(为了简单起见,删除了错误处理):
var connection = mysql.createConnection({ host, user, etc... });
for (var i = 0; i < 10; i++) {
var url = "http://api.com?i="+i;
request(url, function(error, response, body) {
var data = JSON.parse(body);
for (el in data) {
connection.query(
"UPDATE table SET col = ? WHERE symbol = ?",
[
data[el].col,
el
]
);
}
});
}
// this will run before all queries have executed
// resulting in an error
connection.end();
2条答案
按热度按时间xxe27gdn1#
对于任何感兴趣的人,我最终通过混合承诺和计算查询来解决这个问题,类似于这样(不确定这个代码是否真的有效,但想法是存在的):
8aqjt8rx2#
所以,这里的问题是,您正在以同步的方式在这里的数据中循环:
而
mysql
模块以回调样式处理查询:哪里
callback
有签名吗callback(error,rows)
,这样您就可以这样处理结果了,因为它应该有一个可重用的函数:你可以像这样调用你的代码
也就是说,您必须考虑对数据库执行多个查询,不建议在for循环中执行此操作。您应该考虑使用一个更好的解决方案,它可以是您所说的瀑布式解决方案,也可以是使用promise范式的promise解决方案。
假设有这样一个好的函数:
它将一个项目数组和一个执行函数作为输入
function(item,index,resolve,reject)
有决心和拒绝承诺的功能,所以让我们把你的executeQuery
在承诺中也起作用:现在,您可以以完全异步的方式处理您的数据:
在哪里
replaceInString
会帮你准备陈述这就是我们在这里所做的:
仅用于本地承诺
把你的mysql查询变成了一个承诺
以完全异步的方式对数据调用语句
使用了promise和promise all范式,它允许您收集promise的结果,并在所有函数完成时返回给调用者。
捕获所有语句执行中的错误
添加了一种用参数实现语句的简单方法
还要注意arrow函数语法
(param1, param2) =>
这简化了编写函数的方法,对promise范式有很大帮助。