如何阻止我的代码异步运行?
问题描述:
所以我需要以某种方式使我的for循环在我的“readDataBase”函数完成之前verifyDataInFile执行。我正在写节点js,并从MySQL数据库获取数据。 我没有任何提供任何“睡眠”功能的软件包的运气,setTimeOut也不起作用,回调对我没有任何意义。如何阻止我的代码异步运行?
任何帮助将不胜感激。
'use strict';
var mysql = require('mysql');
var fs = require('fs');
var wstream = fs.createWriteStream('Desktop\myOutput.txt');.
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "1234"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
readDataBase();
verifyDataInFile();
});
var readDataBase = function()
{
con.query("SELECT * FROM demo.users", function (err, rows, fields)
{
if (err) {
return;
} else {
for (var i = 0; i < rows.length; i++)
{
wstream.write(rows[i].id + " " + rows[i].firstName + " " + rows[i].lastName + " " + rows[i].email + "\n" + "\n");
}
}
});
}
var verifyDataInFile = function()
{
fs.readFile('Desktop\myOutput.txt', function (err, fs) {
if (err) throw err;
if (fs.indexOf('[email protected]') >= 0) {
console.log("something is here");
} else {
console.log("nope");
}
})
}
答
这里有一些困难的事情发生,但真正的困难是在循环中写入流时很难知道所有写入何时完成。直接从数据库中获取pipe()
到文件中是可能的,但我没有任何东西在我面前进行测试,所以我不会尝试做出一半的尝试,但这是值得研究的。
与此同时,您仍然可以利用MySQL库在“结果”事件中将文件写回您的文件的能力。其优点是,你会知道,当你听到DB的“结束”事件完成后,然后可以进行验证:
var query = con.query("SELECT * FROM demo.users")
query.on('error', function(err) {
// Handle error, an 'end' event will be emitted after this as well
})
query.on('result', function(row){
connection.pause();
// pause so the db waits for the write to finish
wstream.write(rows[i].id + " ...etc", function(){
// write has finished…on to the next row
connection.resume();
});
})
query.on('end', function() {
verifyDataInFile();
});
还有更多关于MySQL的流API这里:https://github.com/mysqljs/mysql#streaming-query-rows
而且这里有一个以csv-transform帮助直接将文件流式传输到一个文件的例子:Using Streams in MySQL with Node
一个愚蠢的想法,但在最糟糕的情况下,请在最后调用verifydatainfile,但在readdatabase函数中调用verifydatainfile。 – koksalb
没有帮助:/同样的问题。我需要在for循环以某种方式执行时停止运行程序。 – Linexxlol
我知道如何js可以用这些东西棘手。我从来没有设法找到一个像这样的可靠解决方案。但这里有另一个愚蠢的想法,让全球布尔成为真实的,并且确实是无所作为,那么当你的阅读完成时,使它成为假的以绕过已经运行的时间来进行。 – koksalb