Spojrzałem na bibliotekę felixge / node-mysql i nie widziałem odniesienia do polecenia client.connect w API. Czy to jest właściwa rozmowa, którą próbujesz wykonać (nie próbując być tu drapieżnym)? Niezależnie od tego, IMHO musisz więcej pomyśleć o tym, jak został zaprojektowany Javascript, ponieważ używa on innego paradygmatu programowania niż większość innych popularnych języków.
Pierwszą kwestią, jaką widzę w Twoim kodzie, jest to, że nie zdefiniowałeś wywołania zwrotnego, więc w rzeczywistości nie istnieje. Zakładam, że console.log (callback) jest niezdefiniowana. W kodzie funkcja anonimowa to „wywołanie zwrotne” dla funkcji client.connect. Musisz zdefiniować to, co nazywasz „oddzwonieniem” w wyższym zakresie. Na przykład zdefiniuję funkcję myCallback, aby istniała w zakresie wyższym niż funkcja anonimowa client.connect. Przydatne może być wyszukanie zakresu zmiennych Javacscript .
var myCallback(err, response) {
if (err) {
console.log('err:%s',err);
} else {
console.log('response:%s',response);
}
}
client.connect(err, function(response) {
if (err) {
myCallback(err);
return;
}
myCallback(null, response);
});
Po drugie, jeśli nie wywołasz w sposób jawny funkcji return w JavaScript, funkcja będzie kontynuować przetwarzanie. I został ugryziony przez ten sam . Wreszcie, Javascript uruchamia pętlę sterowaną zdarzeniami, co oznacza, że nigdy nie będzie czekać, aż funkcje zwrócą wartość, dlatego w pierwszej kolejności mamy wszystkie te wywołania zwrotne. Możesz wymusić inne zachowanie JavaScript, na przykład używając pętli while do momentu spełnienia warunku. Zobacz bibliotekę „async” firmy caolan , aby poznać różne strategie manipulowania pętlą zdarzeń. Główną wadą nadużywania tych metod jest faktyczne marnowanie cykli / blokowania procesora, gdy prawdopodobnie powinieneś użyć więcej wywołań zwrotnych i po prostu ponownie przemyśleć, jak działają twoje programy.