【问题标题】:Javascript process function after double callback双重回调后的Javascript处理函数
【发布时间】:2015-06-06 21:09:03
【问题描述】:

我对 JavaScript 回调函数有疑问。我正在使用 node Js 和 node-mysql 来处理 mysql 查询。当新用户注册时,我需要执行 2 db 检查此电子邮件是否已注册以及此昵称是否已存在以及在此创建 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;
        }
    }
    

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    在函数的开头让我们说你有一个 var counter = 0;

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

    检查昵称->counter++;

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

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

    【讨论】:

    • 是的,我考虑过定时器,但我希望有其他没有定时器的解决方案......
    【解决方案2】:

    这是另一种无需计时器即可实现的方法。

    callfunction("event1"); // call this function on execution of event 1
    callfunction("event2"); // call this function one execution of event 2
    var eventObj = {
            event1: false,
            event2: false
    }; // event object
    
    // function
    function callfunction(eventFrom) {
    
    
    if(eventFrom === "event1") {
    
         eventObj.event1 = true;
     } else {
        eventObj.event2 = true;
     }
    // if condition will be true only when both the events are fired
     if(eventObj.event2 === true && eventObj.event1 === true) {
    
         // callback function
     } 
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多