我有以下代码片段从网址中提取数据,将其显示给用户以及更新mysql数据库 - 除了一个小问题外,其工作正常:
function RunScrapingIndexWatch() {
myhttp.get('http://www.url.com',
function (_html) {
if (_html && _html.length > 10) {
news.indexwatch = [];
$ = cheerio.load(_html);
status = false;
$('td.text21').each(function () {
status = true;
var price1 = parseFloat($(this).text().substr($(this).text().indexOf("Nifty :") + 7, 7).trim());
var abc = stringHelper.getIndiaTime();
var IWTime = abc.toLocaleTimeString();
news.indexwatch.push({
'price1': price1,
'IWTime': IWTime,
});
var post = {
'price1': price1,
'IWTime': IWTime
};
connection.query('INSERT INTO IW SET ?', post, function (err,result){
if (err)
{console.log("IW sql insert error : " +price1 +IWTime);}
else {
console.log("IW data inserted : " +price1 +" | " +IWTime);
}
});
});
if (status) {
io.emit('news', news);
}
if (timerIndexWatch) {
clearTimeout(timerIndexWatch);
}
timerIndexWatch = setTimeout(RunScrapingIndexWatch, config.DelayExtractIndexWatch);
}
});
}
问题在于,在网页显示中(由上面的代码" news.indexwatch.push"生成)短暂的瞬间,IWTime的值显示为未定义 - 我猜这发生在mysql连接查询正在运行。 mysql数据库正在正确更新。
有没有办法在io.emit新闻动作后运行mysql插入查询?有什么建议吗?
答案 0 :(得分:0)
除非您可以使用.emit()
函数的回调,否则。
为什么不等待MySQL完成它的操作,方法是将.emit()
放在connection.query()
回调中:
function RunScrapingIndexWatch() {
myhttp.get('http://www.url.com', function(_html) {
if (_html && _html.length > 10) {
news.indexwatch = [];
$ = cheerio.load(_html);
status = false;
$('td.text21').each(function() {
status = true;
var price1 = parseFloat($(this).text().substr($(this).text().indexOf("Nifty :") + 7, 7).trim()),
abc = stringHelper.getIndiaTime(),
IWTime = abc.toLocaleTimeString(),
post = {
'price1': price1,
'IWTime': IWTime
};
connection.query('INSERT INTO IW SET ?', post, function(err, result) {
if (err) {
console.log("IW sql insert error : " + price1 + IWTime);
} else {
console.log("IW data inserted : " + price1 + " | " + IWTime);
}
news.indexwatch.push(post);
if (status) io.emit('news', news);
}); // connection.query()
if (timerIndexWatch) clearTimeout(timerIndexWatch);
timerIndexWatch = setTimeout(RunScrapingIndexWatch, config.DelayExtractIndexWatch);
}); // $.each()
} // if (_html && ...)
}); // myhttp.get()
}; // RunScrapingIndexWatch