Na życzenie oto komentarze przedstawione jako odpowiedź:
Nie jestem pewien, czy całkowicie rozumiesz fakt, że funkcje w JS są obiektami pierwszej klasy i dlatego mogą być przechowywane do czasu, gdy będą potrzebne, po czasie ich utworzenia.
Na przykład powiedz, że chcesz zapisać do pliku, a następnie wydrukuj komunikat w dzienniku; więc wywołujesz funkcję „write ()” (lub cokolwiek innego) i przekazujesz jej funkcję, która generuje komunikat dziennika (jest to funkcja odroczonego oddzwaniania). „write ()” wewnętrznie przechowuje odniesienie do podanej funkcji, rozpoczyna zapis do pliku i ustawia własne wywołanie zwrotne, aby wiedzieć, kiedy zapis zostanie zakończony. Następnie powraca przed zakończeniem zapisu; kiedy to jest, wewnętrzne wywołanie zwrotne jest w jakiś sposób wywoływane (jest to zadanie frameworku - w przypadku node.js odbywa się to za pomocą pętli zdarzeń), która następnie wywołuje wywołanie zwrotne, które drukuje komunikat dziennika.
Część „odroczona” oznacza po prostu, że twoja funkcja zwrotna nie jest wywoływana od razu; wywoływanie go jest odraczane do odpowiedniego czasu. W przypadku funkcji asynchronicznych, takich jak wiele w node.js, dane wywołanie zwrotne jest generalnie wywoływane po zakończeniu operacji (lub wystąpi błąd).
Większość rzeczy jest asynchroniczna w node.js, ale w przeglądarce np. JQuery, większość rzeczy jest faktycznie synchroniczna (z wyjątkiem, oczywiście, dla żądań AJAX). Ponieważ funkcje pierwszej klasy są tak przydatne w JavaScript (szczególnie ze względu na doskonałą obsługę zamykania), wywołania zwrotne są również używane wszędzie w przeglądarce, ale nie są „odraczane” dla operacji synchronicznych (z wyjątkiem przypadków, gdy nie są wywoływane natychmiast przez Ty, ale później przez funkcję, którą wywołujesz).
Fakt, że system bazowy jest sterowany zdarzeniami, jest ortogonalny wobec korzystania z odroczonych wywołań zwrotnych; możesz sobie wyobrazić (bardzo wolną) wersję node.js, która uruchamiała wątek dla każdej operacji, a następnie wywołała określone wywołanie zwrotne, gdy wątek zakończył pracę, w ogóle nie wykorzystując zdarzeń. Oczywiście jest to okropny model, ale ilustruje mój punkt widzenia :-)
Deferred
obiekty jQuery ? Czy chodzi o coś specyficznego dla Node.js?