如何阻止我的代码异步运行?

问题描述:

所以我需要以某种方式使我的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"); 
     } 
    }) 
} 
+1

一个愚蠢的想法,但在最糟糕的情况下,请在最后调用verifydatainfile,但在readdatabase函数中调用verifydatainfile。 – koksalb

+1

没有帮助:/同样的问题。我需要在for循环以某种方式执行时停止运行程序。 – Linexxlol

+0

我知道如何js可以用这些东西棘手。我从来没有设法找到一个像这样的可靠解决方案。但这里有另一个愚蠢的想法,让全球布尔成为真实的,并且确实是无所作为,那么当你的阅读完成时,使它成为假的以绕过已经运行的时间来进行。 – koksalb

这里有一些困难的事情发生,但真正的困难是在循环中写入流时很难知道所有写入何时完成。直接从数据库中获取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