# Javascript ćwiczenia - Wywołanie synchroniczne i asynchroniczne ### Przygotowanie Pobierz i rozpakuj plik ZIP. W środku znajdują się pliki tekstowe. Trzy katalogi zawierają pule 5, 30 i 1000 plików. W każdym pliku znajduje się jedna losowa liczba całkowita i znak końca linii. Osobne katalogi zawierają oddzielne dane testowe. Wszystkie napisane programy powinny na raz wczytywać tylko pliki z jednego katalogu (Może to być sterowane za pomocą argumentu linii poleceń, lub zapisane na sztywno w kodzie.) [**PACZKA DO POBRANIA**](https://github.com/pico-coder/sigrok-pico/files/9042404/numbers.zip) ### Zadanie 1. Z wykorzystaniem modułu [fs](https://nodejs.org/api/fs.html), napisz program, który wczyta liczby z plików synchronicznie (za pomocą metody [`fs.readFileSync()`](https://nodejs.org/api/fs.html#fsreadfilesyncpath-options)). Program ma wyświetlić sumę liczb. Aplikacja nie powinna wyświetlać w terminalu żadnych komunikatów poza wynikiem. Przydatna może się też okazać biblioteka [path](https://nodejs.org/api/path.html). **UWAGA!** Czytając dokumentację NodeJS upewnij się, że oglądasz wersję dokumentacji odpowiadającą twojej wersji Node, którą zainstalowałeś w systemie. ### Zadanie 2. Napisz drugi skrypt, który realizuje to samo zadanie co powyżej, jednak w sposób asynchroniczny. Nie korzystaj ze słów kluczowych `async` oraz `await`, ani obietnic. Program ma być zrealizowany z wykorzystaniem techniki wywołań zwrotnych (callback), czyli metody [`fs.readFile()`](https://nodejs.org/api/fs.html#fsreadfilepath-options-callback). ### Zadanie 3. Porównaj wyniki oraz czas wykonania obu programów (_wyniki powinny być takie same :p_) dla liczb z katalogu `batch3` zawierającego najwięcej liczb. Czas wykonania możesz sprawdzić za pomocą linuxowego polecenia `time` w konsoli, jeśli jest ono dostępne w twoim terminalu (`git-bash`?), lub mierząc czas wewnątrz Node za pomocą `console.time()` oraz `console.timeEnd()`. Stosując podejście z node, możesz ominąć pomiar czasu załączania bibliotek - wystarczy zmierzyć czas wykonania głównej części programu. Oba programy zmierz w ten sam sposób i porównaj wyniki. ### Zadanie 4*. Napisz jeszcze raz ten sam program, lecz tym razem z wykorzystaniem składni obietnic. Wykorzystaj [promise-api](https://nodejs.org/api/fs.html#promises-api) modułu fs, jeśli jest dostępne w twojej wersji Dode lub metodę [`util.promisify()`](https://nodejs.org/api/util.html#utilpromisifyoriginal) z modułu [util](https://nodejs.org/api/util.html). ### Zadanie 5*. Przepisz program z zadania [4](#Zadanie-4*.) na składnię `async`, `await`. ### Podsumowanie Wyniki obliczeń przestaw na wykresie słupkowym. Jeśli zbiory danych były zbyt małe, aby dało się zauważyć róznice między czasem wykonania programów, zgłoś się po większy zbiór plików. Odpowiednio oznacz serie danych i skalę. Wyjaśnij, czym się różni snychroniczne przetwarzanie danych od asynchronicznego (przedstawienie w postaci graficznej to wyśmienity pomysł!). Czy NodeJS korzysta z wielu wątków w trakcie przetwarzania równoległego? ### Wyniki Tabela zawiera prawidłowe wyniki, zakodowane w [MD5](https://uw-team.org/dekoder.html), aby można było sprawdzić, czy sumy wyszły poprawne: Katalog | Liczba Plików | Suma w MD5 --- | -:| --- batch1 | 5 | `8baca01b732cf56f7ce83df216514363` batch3 | 30 | `ee77f23899e911ace641794f89c19e1c` batch4 | 1000 | `4ce6d8f66c9966839ba4d5ff7413d936`