【问题标题】:How can i stop my code from running asynchronously?如何阻止我的代码异步运行?
【发布时间】:2017-10-10 17:47:27
【问题描述】:

所以我需要在执行 verifyDataInFile 之前以某种方式使我的“readDataBase”函数中的 for 循环完成。我正在用节点 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('ut.cursus.luctus@utipsumac.org') >= 0) {
            console.log("something is here");
        } else {
            console.log("nope");
        }
    })
}

【问题讨论】:

  • 一个愚蠢的想法,但在最坏的情况下,在 readdatabase 函数的末尾调用 verifydatainfile。
  • 没有帮助:/同样的问题。我需要在 for 循环以某种方式执行时停止程序运行。
  • 我知道 js 处理这些东西会很棘手。我从来没有像以往一样找到一个可靠的解决方案。但是这里有另一个愚蠢的想法,将全局布尔值设为真,当它为真时什么都不做,然后当你的读取完成时,让它为假,绕过已经运行的 while。
  • 不要这样做,而是学习如何进行正确的异步编程。您应该做的不是学习如何绕过它,而是学习如何在保持异步的同时执行顺序步骤。正确使用回调是朝着这个方向迈出的第一步。
  • 如果你不喜欢这个答案,你能做的最好的事情就是使用不是这样设计的语言。这就是 node.js 中的程序应该如何工作的字面意思。

标签: javascript mysql node.js


【解决方案1】:

您在这里遇到了一些困难的事情,但真正的困难是在循环中写入流时,很难知道所有写入何时完成。可以将pipe() 直接从数据库发送到文件,但我面前没有任何东西可以测试,所以我不会尝试半生不熟的尝试,但值得研究。

同时,您仍然可以利用 MySQL 库在“结果”事件中在写入文件时返回流的能力。优点是当您听到数据库的“结束”事件时您将知道您已完成,然后可以继续进行验证:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2011-08-19
    • 2021-06-10
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多