Wygląda na to, że wprowadzasz w błąd asynchroniczne IO z funkcjami asynchronicznymi. node.js używa asynchronicznego nieblokującego IO, ponieważ nie blokujące IO jest lepsze. Najlepszym sposobem, aby to zrozumieć, jest obejrzenie filmów Ryana Dahla.
Jak napisać funkcje asynchroniczne dla węzła?
Po prostu pisz normalne funkcje, jedyną różnicą jest to, że nie są wykonywane natychmiast, ale przekazywane jako wywołania zwrotne.
Jak należy wdrożyć zdarzenie błędu obsługi prawidłowo
Ogólnie API daje zwrotnego z ERR jako pierwszy argument. Na przykład:
database.query('something', function(err, result) {
if (err) handle(err);
doSomething(result);
});
Jest to wspólny wzór.
Innym częstym wzorem jest on('error')
. Na przykład
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
Edit:
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
Powyższa funkcja, gdy nazywa się
async_function(42, function(val) {
console.log(val)
});
console.log(43);
wypisze 42
do konsoli asynchronicznie. W szczególności process.nextTick
strzela po tym, jak bieżący pakiet zdarzeń eventloop jest pusty. Ten stos wywołań jest pusty po uruchomieniu async_function
i console.log(43)
. Więc drukujemy 43, a następnie 42
Prawdopodobnie powinieneś zrobić trochę czytania w pętli zdarzeń.
Dlatego proszę. Nie jest dla mnie jasne, w jaki sposób te funkcje są inne. – Kriem
Polecam, abyś spojrzał na 'setTimeout' i' setInterval' w swojej ulubionej przeglądarce i baw się z nimi również. Lub wywołania ajaxowe (prawdopodobnie najbardziej zbliżone do doświadczenia węzła) lub detektory zdarzeń dla rzeczy, które znasz, takich jak zdarzenia klikania i ładowania. Model asynchroniczny istnieje już w przeglądarce i jest dokładnie taki sam w węźle. – davin
@davin - Chyba nie w pełni rozumiem wtedy model asynchroniczny. – Kriem