我看到了不同的帖子回調函數,但它不適合我想要做的。
是的,你只需要改變你對代碼的思考方式。而不是寫email_already_exists_in_mysql
的則應該寫一個函數調用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();
}
}
)
}
然後,而不是寫這個:
//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
}
你寫這樣的而不是:
//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
})}
現在,你可能會問自己,如果之後還有其他人呢?那麼,你需要修改if_email_already_exists_in_mysql
功能表現得像和if...else
,而不是僅僅與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();
}
}
)
}
,這樣你可以說它是這樣的:
//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
}
)}
您可以編寫異步代碼做幾乎任何常規的代碼只能做,而不是返回你在回調中傳遞的值。記住:
同步碼返回 ==傳遞回調在異步代碼。
因此,代碼結構必須不同,但正如我上面演示的那樣,您要實現的邏輯可以完全相同。
對JS的異步工作看看承諾。你有用於node.js的Q庫。 – TMichel
對'.query'的調用是* asynchronous *。這就是爲什麼你必須提供回調。看看這個問題,瞭解問題和潛在的解決方案:http://stackoverflow.com/q/14220321/218196(即使它是關於Ajax,同樣的原則適用)。 –
@TMichel你得到任何錯誤。 – sachin