双回调后的Javascript进程函数

时间:2015-06-06 21:09:04

标签: javascript mysql node.js

我遇到了JavaScript回调函数的问题。我使用节点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;
        }
    }
    

2 个答案:

答案 0 :(得分:0)

在函数开始时,我们假设你有一个var counter = 0;

在支票邮件中 - >计数器++;

检查昵称 - >计数器++;

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

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

}

答案 1 :(得分:0)

这是在没有计时器的情况下实现它的另一种方法。

if let bd = birthDate! as? NSDate { ... continue save ... }
else { doAlert("You need to specify your birth date") }