Od kilku lat zajmuję się JavaScriptem (Vanilla JS, jQuery, Backbone itp.), A ostatnio pracowałem z Node.js. Trochę czasu zajęło mi zrozumienie programowania „nieblokującego”, ale teraz przyzwyczaiłem się do używania wywołań zwrotnych do operacji we / wy i tak dalej.
Rozumiem, że JavaScript jest z natury jednowątkowy. Rozumiem pojęcie „kolejki zdarzeń” węzła. Nie rozumiem, co decyduje o tym, czy pojedyncza operacja javascript „blokuje”, a „nie blokuje”. Skąd mam wiedzieć, na których operacjach mogę polegać, aby uzyskać dane wyjściowe synchronicznie, aby użyć ich w późniejszym kodzie, a na których muszę przekazać wywołania zwrotne, aby móc przetworzyć dane wyjściowe po zakończeniu operacji początkowej? Czy jest gdzieś lista funkcji JavaScript, które są asynchroniczne / nieblokujące, oraz lista funkcji synchronicznych / blokujących? Co sprawia, że moja aplikacja Javascript nie jest jedną wielką rasą?
Wiem, że operacje, które zajmują dużo czasu, takie jak operacje We / Wy w operacjach Node i AJAX w Internecie, wymagają od nich asynchroniczności i dlatego wymagają wywołań zwrotnych - ale kto określa, co można uznać za „długi czas”? Czy istnieje jakiś wyzwalacz w tych operacjach, który usuwa je z normalnej „kolejki zdarzeń”? Jeśli nie, co odróżnia je od prostych operacji, takich jak przypisywanie wartości do zmiennych lub zapętlanie tablic, od których, jak się wydaje, możemy polegać na zakończeniu synchronicznym?
Być może nawet nie myślę o tym poprawnie - mam nadzieję, że ktoś mnie wyprostuje. Dzięki!
Odpowiedzi:
Ogólnie rzecz biorąc, każda funkcja, która korzysta z sieci lub używa timerów do wykonywania zadań przez pewien czas, będzie asynchroniczna.
Jeśli funkcja odbiera wywołanie zwrotne, możesz sprawdzić, do czego służy wywołanie zwrotne, i zwykle będzie oczywiste, czy jest asynchroniczne, czy nie. Jeśli funkcja nie oferuje wywołania zwrotnego, oznacza to, że nie ma możliwości komunikowania wyników asynchronicznych, więc prawdopodobnie nie jest asynchroniczna.
Nie ma na pewno żelaznego sposobu, aby to stwierdzić. Musi to zostać określone w dokumencie dla funkcji lub oczywiste ze sposobu działania interfejsu.
Operacje asynchroniczne różnią się pod osłonami niż operacje synchroniczne, ponieważ operacje asynchroniczne mają na celu skonfigurowanie operacji, rozpoczęcie operacji, a następnie powiadomienie później o postępie, zakończeniu lub błędach w operacji. Iterowanie tablicy jest operacją synchroniczną. Nie ma żadnego z tych problemów. Kod działa tylko synchronicznie. Wywołanie wywołania ajax polega na zarejestrowaniu wywołania zwrotnego dla powiadomień o stanie, następnie uruchomieniu wywołania ajax, a następnie kontynuowaniu uruchamiania innego javascript, a następnie jakiś czas później wywołanie zwrotne jest wywoływane ze zmianą stanu wywołania ajax (np. Ukończeniem).
źródło
XMLHttpRequest.open
maasync
parametr boolowski , który kontroluje, czy późniejsze wywołaniesend
jest asynchroniczne.Z tego, co rozumiem, nie pytasz o to , co powinieneś uczynić asynchronicznym, ale jak stwierdzić, czy funkcja jest asynchroniczna.
Sprawdzasz dokumentację. Poważnie - po to jest. Nie zgadujesz, co robi funkcja na podstawie jej nazwy lub jej kontekstu. Jeśli nie masz pewności i masz dostęp do jego kodu źródłowego, sprawdź to.
To jedyny całkowicie niezawodny sposób.
Teraz czas na oszacowanie.
źródło
Ponieważ JavaScript jest jednowątkowy, wszystkie bloki przetwarzania są przetwarzane do momentu wystąpienia jednego z poniższych zdarzeń
1) Bieżące wykonanie żąda usługi zewnętrznej, takiej jak żądanie We / Wy lub sieci, lub żądanie pracownika sieci
2) Wywołanie funkcji jest ustawiane na zegarze w celu wykonania w późniejszym czasie
Nie ma listy funkcji blokujących / nieblokujących. Powinieneś sprawdzić dokumentację.
Twoja aplikacja może napotkać warunek wyścigu, jeśli wiele zewnętrznych usług ma blokadę wątku javascript i spróbuje uzyskać do niego dostęp w tym samym czasie. Nowoczesne przeglądarki i silnik V8 radzą sobie z tym, ale możesz napotkać ten warunek wyścigu, jeśli używasz telefonu i piszesz aplikacje javascript na urządzenia mobilne. Wsparcie nie jest w stanie poradzić sobie w tych warunkach wyścigowych.
Zasadniczo zakładaj bloki kodu, chyba że istnieje wywołanie zwrotne. I nawet jeśli istnieje oddzwonienie, to nie znaczy, że nie będzie blokować.
źródło
Ja też jestem nowy w node.js (i JavaScript w ogóle) i nie jestem przyzwyczajony do tak dużego kodu asynchronicznego. Chciałem tylko zauważyć , że w Omówieniu blokowania vs nieblokowania na stronie nodejs.org stwierdza się, że:
źródło