javascript - node-mysql 计时

标签 javascript mysql node.js timing node-mysql

我有一个这样的递归查询(注意:这只是一个例子):

var user = function(data)
{
  this.minions = [];
  this.loadMinions = function()
  {
    _user = this;
    database.query('select * from users where owner='+data.id,function(err,result,fields)
    {
      for(var m in result)
      {
        _user.minions[result[m].id] = new user(result[m]); 
        _user.minions[result[m].id].loadMinions();
      }
    }  
    console.log("loaded all minions");
  }
}
 currentUser = new user(ID);
 for (var m in currentUser.minions)
 {
   console.log("minion found!");
 }

这不起作用,因为时间都错了,代码不等待查询。

我试过这样做:

var MyQuery = function(QueryString){
    var Data;
    var Done = false;
    database.query(QueryString, function(err, result, fields) { 
        Data = result;
        Done = true;
    });
    while(Done != true){};
    return Data;
}

var user = function(data)
{
  this.minions = [];
  this.loadMinions = function()
  {
    _user = this;
    result= MyQuery('select * from users where owner='+data.id);
    for(var m in result)
    {
      _user.minions[result[m].id] = new user(result[m]); 
      _user.minions[result[m].id].loadMinions();
    }
    console.log("loaded all minions");
  }
}
currentUser = new user(ID);
for (var m in currentUser.minions)
{
  console.log("minion found!");
}

但他只是愣了一下,我是不是漏掉了什么?

最佳答案

解决问题的第一个障碍是理解 Node.js 中的 I/O 是异步的。一旦您知道这如何适用于您的问题,递归部分就会容易得多(尤其是如果您使用像 Async 或 Step 这样的流程控制库)。

这是一个示例,它执行您正在尝试执行的某些操作(减去递归)。就个人而言,我会避免像这样递归加载可能未知数量/深度的记录;而是按需加载它们,如本例所示:

var User = function(data) {
    this.data = data
    this.minions;
};

User.prototype.getMinions = function(primaryCallback) {
    var that = this; // scope handle
    if(this.minions) { // bypass the db query if results cached
        return primaryCallback(null, this.minions);
    }

    // Callback invoked by database.query when it has the records
    var aCallback = function(error, results, fields) {
        if(error) {
            return primaryCallback(error);
        }

        // This is where you would put your recursive minion initialization
        // The problem you are going to have is callback counting, using a library
        // like async or step would make this party much much easier

        that.minions = results; // bypass the db query after this
        primaryCallback(null, results);
    }

    database.query('SELECT * FROM users WHERE owner = ' + data.id, aCallback);
};

var user = new User(someData);    
user.getMinions(function(error, minions) {
    if(error) {
        throw error;
    }

    // Inside the function invoked by primaryCallback(...)
    minions.forEach(function(minion) {
        console.log('found this minion:', minion);
    });
});

在这个例子中最值得注意的是回调。 database.query(...) 是异步的,您不想占用事件循环等待它完成。这通过为查询提供回调 aCallback 来解决,该回调在结果准备好时执行。一旦该回调触发,并且在您对记录执行任何您想做的处理之后,您可以触发带有最终结果的 primaryCallback

关于javascript - node-mysql 计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11018998/

相关文章:

javascript - 如果我的网站通过 iframe 打开第 3 方网站,第 3 方网站能否成功设置自己的 cookie?

javascript - CSS 和 Javascript 中的选项卡式菜单 - 选项卡在刷新页面后设置为事件状态

javascript - 聊天机器人应答/响应时间 js 中的代码

php - 使用单选按钮将行插入数据库

javascript - 在动态创建的 HTML 表中调用 PHP 函数

javascript - 使用异步 js 迭代数组并在回调中执行函数以返回单个结果

javascript - 如何避免在 Node 中插入重复记录,sqlite [knex,objectionJS]

javascript - jquery 数据表 - 为 select.className 应用值未按预期工作

php - 如何在 MySQL + PHP 中将所有列作为行

javascript - gcloud-node - 如何确保通过签名 URL 上传到 Google Cloud Storage 的文件是公开可读的?