双重callback后的Javascript处理函数

我有一个JavaScriptcallback函数的问题。 我使用节点Js和节点mysql来处理mysql查询。 当新用户注册我需要做2分贝检查,如果这封电子邮件已经注册,如果这个昵称已经存在,并在这之后创buildINSERT语句。 但问题是,我不知道如何检查电子邮件检查和昵称检查,因为他们有2个不同的callback函数。 请帮助我如何做到这一点最好的方式。

  1. Console.log看起来像这样!
  2. 检查昵称
  3. 检查电子邮件
  4. 插入新行! – 这必须是最后一个,但它在这里:(((
  5. 昵称CallBack!
  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;

在检查邮件 – >计数器++;

在检查昵称 – >计数器++;

现在调用函数来检查邮件,检查昵称,让我们把它命名为checkStatus

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

这是没有计时器的另一种实现方法。

 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 } }