Sim, você só precisa mudar a maneira como pensa sobre o código. Em vez de escrever
email_already_exists_in_mysql
você deve escrever uma função chamada if_email_already_exists_in_mysql
:/* Executes callback if email
* already exists in mysql:
*/
function if_email_already_exists_in_mysql (email,callback) {
connection.query(
'SELECT COUNT(*) AS nb FROM user WHERE emailUser = ' +
connection.escape(email),
function(err, rows, fields) {
if(rows[0].nb != 0) {
callback();
}
}
)
}
Então, em vez de escrever isso:
//If the email hasn't a good format
if(email_not_good_format()) {
//I do something
}
else if(email_already_exists_in_mysql(email)) {
//I do something
}
você escreve assim:
//If the email hasn't a good format
if(email_not_good_format()) {
//I do something
}
else {if_email_already_exists_in_mysql(email),function(){
//I do something
})}
Agora, você pode se perguntar, e se houver outro depois disso? Bem, você precisa modificar o
if_email_already_exists_in_mysql
função para se comportar como e if...else
em vez de apenas e if
:function if_email_already_exists_in_mysql (email,callback,else_callback) {
connection.query(
'SELECT COUNT(*) AS nb FROM user WHERE emailUser = ' +
connection.escape(email),
function(err, rows, fields) {
if(rows[0].nb != 0) {
callback();
}
else if(else_callback) {
else_callback();
}
}
)
}
para que você possa chamá-lo assim:
//If the email hasn't a good format
if(email_not_good_format()) {
//I do something
}
else {
if_email_already_exists_in_mysql(email),function(){
//I do something
},
// else
function(){
//I do something else
}
)}
Você pode escrever código assíncrono para fazer praticamente qualquer coisa que o código normal possa fazer apenas em vez de retornar um valor que você passa em um retorno de chamada. Lembrar:
retornar em código síncrono ==passando em retornos de chamada em código assíncrono.
A estrutura do código deve, portanto, ser diferente, mas como demonstrei acima, a lógica que você deseja implementar pode ser exatamente a mesma.