双重回调后的Javascript处理函数

标签 javascript mysql node.js

我对 JavaScript 回调函数有疑问。我正在使用 Node Js 和 Node mysql 来处理 mysql 查询。当新用户注册时,我需要做 2 次数据库检查,如果这个电子邮件已经注册,这个昵称是否已经存在,并在此之后创建 INSERT 语句。但问题是我不知道如何在检查电子邮件和检查昵称时捕捉到它们,因为它们有 2 个不同的回调函数。请帮助我如何以最佳方式做到这一点。

  1. Console.log 看起来像这样!
  2. 检查昵称
  3. 检查电子邮件!
  4. 插入新行! -- 这一定是最后但它在这里 :(((
  5. 昵称 回调!
  6. 电子邮件回调!

    checkNickName(nickname);  
    var checkMail = checkEmail(email);
    
    if(!checkMail){  // The problem is when this runs CallBack still not received from Mail and from NickName too
    console.log('Inserting new row!');
    connection.query("INSERT INTO `user` (`email`, `password`, `nickname`, `auth`, `token`, `balance`, `role`, `language`, `last_visit`, `register_date`) VALUES ('"+email+"', '"+password+"', '"+nickname+"', '"+auth+"', '"+token+"', '"+balance+"', '"+role+"', '"+language+"', CURRENT_TIMESTAMP, '"+registerDate+"');", function(err, rows, fields) {
        if (err) return 2;
    
        console.log(rows);
    
        return 3;
    });
    }
    
    
    
    
    function checkNickName(nickname){
        console.log('Checking nickname');
        connection.query("SELECT id FROM user WHERE `nickname` = '"+nickname+"'", function(err, rows, fields) {
            if (err) callback(err);
    
            callback(rows);
        });
    
        function callback(res){
            console.log('Nickname CallBack!');
            if (!res) { nickname = nickname + Math.floor((Math.random() * 10000) + 1); }
            return res;
        }
    }
    
    function checkEmail(email){
        console.log('Checking Email!');
        connection.query("SELECT id FROM user WHERE `email` = '"+email+"'", function(err, rows, fields) {
            if (err) callback('email',false);
    
    
            callback(rows);
        });
    
        function callback(res){
            console.log('Email CallBack!');
            if (!res) { nickname = nickname + Math.floor((Math.random() * 10000) + 1); }
            return res;
        }
    }
    

最佳答案

在函数的开头,让我们假设您有一个 var counter = 0;

在检查邮件中 -> counter++;

在检查昵称->counter++;

现在并行调用一个函数来检查邮件,检查昵称,我们将其命名为checkStatus

function checkStatus(){
    if(counter == 2) {
            // Call the callback
    } else {
        setTimeout(checkStatus, 1000);
    }

}

关于双重回调后的Javascript处理函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687579/

相关文章:

javascript - 单个socks5授权并使用node.js发出多个请求

javascript - 在 jqGrid 的行中添加自定义按钮?

Javascript - 通过另一个数组中的值在子数组中查找

javascript - 自动将目标文件夹中的所有脚本包含在运行脚本中 - CS6

JavaScript 显示持续时间

mysql - Typeorm groupBy 按 orderBy 另一列获取最后一行

mysql - 子查询值的总和

MySQL 5.6 InnoDB 全文搜索

javascript - Kibana 不显示从 Node.js Winston Logger 发送到 Elasticsearch 的日志

javascript - 如何让 eslint 为 Node js 中的整个目录工作