【发布时间】:2014-07-04 19:40:03
【问题描述】:
我想为每个循环做一个但让它同步运行。循环的每次迭代都会执行一次 http.get 调用,并返回 json 以将值插入数据库。问题是for循环异步运行,导致所有http.gets同时运行,我的数据库最终没有插入所有数据。我正在使用async-foreach来尝试做我想做的事这样做,但如果我能以正确的方式做到这一点,我就不必使用它。
mCardImport = require('m_cardImport.js');
var http = require('http');
app.get('/path/hi', function(req, res) {
mCardImport.getList(function(sets) {
forEach(sets, function(item, index, arr) {
theUrl = 'http://' + sets.set_code + '.json';
http.get(theUrl, function(res) {
var jsonData = '';
res.on('data', function(chunk) {
jsonData += chunk;
});
res.on('end', function() {
var theResponse = JSON.parse(jsonData);
mCardImport.importResponse(theResponse.list, theResponse.code, function(theSet) {
console.log("SET: " + theSet);
});
});
});
});
});
});
还有我的模特
exports.importResponse = function(cardList, setCode, callback) {
mysqlLib.getConnection(function(err, connection) {
forEach(cardList, function(item, index, arr) {
var theSql = "INSERT INTO table (name, code, multid, collector_set_num) VALUES "
+ "(?, ?, ?, ?) ON DUPLICATE KEY UPDATE id=id";
connection.query(theSql, [item.name, setCode, item.multid, item.number], function(err, results) {
if (err) {
console.log(err);
};
});
});
});
callback(setCode);
};
【问题讨论】:
-
您可以使用
async.each尽管鉴于您发布的内容,您应该能够异步/并行执行此操作,所以我想弄清楚为什么您的所有数据都不是插入。没有理由无缘无故地放慢速度。 -
我也不知道为什么。但我预计大约有 24,000 条记录,而且它的记录要少得多。当我截断表格并重新运行它时,它类似于 3,000 或 5,000 这个数字并不总是相同的。所以我认为我在太短的时间内抛出了太多的 http.get 请求和/或太多的 MYSQL 调用,导致事情被遗漏/丢弃。
-
@Joe 我要感谢你建议我重新查看我的代码,我发现我没有在每个 export.importResponse 的末尾明确调用 connection.release() ()。我认为 connection.release() 是自动调用的,但是当我再次检查并明确添加它时,它现在可以正常工作,并且所有 24,000 条记录都按预期添加。再次感谢!
标签: javascript mysql node.js synchronous