我对 JavaScript 回调函数有疑问。我正在使用 Node Js 和 Node mysql 来处理 mysql 查询。当新用户注册时,我需要做 2 次数据库检查,如果这个电子邮件已经注册,这个昵称是否已经存在,并在此之后创建 INSERT 语句。但问题是我不知道如何在检查电子邮件和检查昵称时捕捉到它们,因为它们有 2 个不同的回调函数。请帮助我如何以最佳方式做到这一点。
- Console.log 看起来像这样!
- 检查昵称
- 检查电子邮件!
- 插入新行! -- 这一定是最后但它在这里 :(((
- 昵称 回调!
电子邮件回调!
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/