2015-06-06 23 views
2

我有一個JavaScript回調函數的問題。我使用節點Js和node-mysql來處理mysql查詢。當新用戶註冊時,我需要做2分貝檢查,如果這封電子郵件已經註冊,並且這個暱稱已經存在,並且在此之後創建INSERT語句。但問題是,我不知道如何檢查電子郵件檢查和暱稱檢查,因爲他們有2個不同的回調函數。請幫助我如何做到這一點最好的方式。雙重回調後的Javascript處理函數

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

回答

0

在函數的開始,讓我們說你有一個變種!計數器= 0;

在檢查郵件 - >計數器++;

在檢查暱稱 - >計數器++;

現在調用一個函數並行查郵件,查暱稱,讓我們把它命名爲的checkStatus

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

} 
+0

是的,我想到了定時器,但我希望有一些沒有定時器的另一種解決方案... – user3278989

0

這裏是實現它沒有計時器的另一種方式。

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 
} 

}