Wyjaśnienie obietnic JavaScript: następnie catch, Promise.all i typowe błędy
Obietnice to sposób, w jaki JavaScript obsługuje pracę, która kończy się później, a na ich podstawie zbudowana jest async/await. Dowiedz się, jak naprawdę się zachowują, korzystając z rzeczywistych wyników każdego przykładu, i unikaj błędów, które połykają Twoje błędy.
- obietnica to obiekt reprezentujący wynik, który będzie dostępny później.
- Oczekuje, dopóki nie zostanie spełniony lub odrzucony, a raz rozstrzygnięty nigdy się nie zmienia.
- Każde
thenzwraca nową obietnicę, co umożliwia tworzenie łańcuchów. - Użyj
Promise.all, gdy wymagany jest każdy wynik, iPromise.allSettled, gdy chcesz mieć każdy wynik.
Żądania sieciowe, odczyty plików i liczniki czasu kończą się później, ale JavaScript nie może po prostu zatrzymać się i poczekać, w przeciwnym razie strona się zawiesi. JavaScript obiecuje umożliwić schludny sposób powiedzenia „kiedy to się skończy, zrób tamto, a jeśli się nie powiedzie, zrób zamiast tego to”.
Nawet jeśli piszesz głównie async i await, pod spodem używasz obietnic, więc ich zrozumienie znacznie ułatwia debugowanie. Uruchomiliśmy te przykłady w Node.js 24 i pokazane dane wyjściowe pochodzą z tego uruchomienia. Zachowują się tak samo w nowoczesnych przeglądarkach.
Co to jest obietnica?
Obietnica jest symbolem zastępczym przyszłej wartości. Pomyśl o brzęczyku, który podaje Ci restauracja, gdy składasz zamówienie. Nie masz jeszcze jedzenia, ale trzymasz coś, co powie Ci, kiedy będzie gotowe lub że jest problem, a tymczasem możesz zająć się innymi rzeczami.
W kodzie funkcja asynchroniczna natychmiast zwraca obietnicę i dołączasz, co powinno się dalej wydarzyć:
fetch("/api/user")
.then((response) => response.json())
.then((user) => console.log(user.name))
.catch((error) => console.log("Failed:", error.message));
Trzy stany obietnicy
| Stan | Znaczenie | Co biegnie |
|---|---|---|
| Oczekujące | Praca nie została ukończona | Jeszcze nic |
| Spełniony | Skończyło się wartością | then osoby zajmujące się obsługą |
| Odrzucony | Nie udało się z jakiegoś powodu | catch osoby zajmujące się obsługą |
Obietnicę, która zostaje spełniona lub odrzucona, nazywa się rozliczoną. Obietnica może zostać spełniona tylko raz. Następnie jego stan i wartość są ustalane, a późniejsze wywołania resolve lub reject są ignorowane.
Stwórz obietnicę
Zwykle korzystasz z obietnic z interfejsów API, takich jak fetch, ale utworzenie jednego pokazuje, jak działają. Konstruktor otrzymuje dwie funkcje resolve i reject:
function fetchUser(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id > 0) {
resolve({ id, name: "Asha" });
} else {
reject(new Error("Invalid id"));
}
}, 100);
});
}
console.log(fetchUser(1));
// Promise { <pending> }
Natychmiastowe zarejestrowanie obietnicy pokazuje, że nadal oczekuje ona na realizację, ponieważ licznik czasu nie został uruchomiony. Wartość można osiągnąć tylko poprzez procedurę obsługi lub await. Zawsze odrzucaj za pomocą obiektu Error, a nie ciągu, ponieważ Error zawiera ślad stosu, który pomaga w debugowaniu.
potem złap i wreszcie
Te trzy metody dołączają procedury obsługi do obietnicy:
fetchUser(1).then((user) => console.log(user.name));
// Asha
fetchUser(-1)
.then((user) => console.log("never runs", user))
.catch((error) => console.log("caught:", error.message))
.finally(() => console.log("finally"));
// caught: Invalid id
// finally
then działa w przypadku powodzenia, catch działa w przypadku niepowodzenia i finally działa w obie strony. To sprawia, że finally jest właściwym miejscem do sprzątania, np. ukrywania spinnera ładującego. Nie przyjmuje żadnych argumentów, bo nie powinien przejmować się wynikiem.
Łańcuch obietnic
Kluczową ideą jest to, że then zawsze zwraca nową obietnicę. Cokolwiek zwróci Twój handler, staje się wartością tej nowej obietnicy:
Promise.resolve(2)
.then((n) => n * 10)
.then((n) => n + 1)
.then((n) => console.log("chain:", n));
// chain: 21
Jeśli przewodnik zwróci kolejną obietnicę, łańcuch czeka, aż się uspokoi, zanim przejdzie dalej. Oto, co zamienia zagnieżdżone wywołania zwrotne w płaską sekwencję kroków:
getUser(id)
.then((user) => getOrders(user.id))
.then((orders) => getInvoice(orders[0].id))
.then((invoice) => console.log(invoice.total))
.catch(handleError);
Jak błędy przemieszczają się w łańcuchu
Odrzucona obietnica pomija co then, aż osiągnie catch. Wrzucenie do wnętrza przewodnika również liczy się jako odrzucenie. A catch, który powraca normalnie, przywraca łańcuch na właściwe tory:
Promise.resolve("start")
.then(() => {
throw new Error("step 2 failed");
})
.then(() => console.log("skipped"))
.catch((error) => {
console.log("caught:", error.message);
return "recovered";
})
.then((value) => console.log("continues:", value));
// caught: step 2 failed
// continues: recovered
Pomyśl o tym jak o asynchronicznej wersji try i catch. Jeden catch na końcu zwykle obejmuje cały łańcuch. Jeśli chcesz tylko zarejestrować błąd i nadal ci się to nie udaje, wyrzuć go ponownie z wnętrza catch.
Wskazówka: fetch odrzuca tylko w przypadku awarii sieci. Odpowiedź 404 lub 500 nadal jest spełniona, więc sprawdź sam response.ok. W naszej ściągawce dotyczącej kodów stanu HTTP wyjaśniono, co oznacza każdy kod.
Promise.all, allSettled, rasa i dowolne
Te statyczne metody koordynują kilka obietnic jednocześnie. Wszystkie pobierają tablicę i zwracają jedną obietnicę.
| Metoda | Spełnia się, gdy | Odrzuca kiedy | Użyj go do |
|---|---|---|---|
Promise.all |
Wszystkie spełniają | Każdy odrzuca | Wszystkie wyniki są wymagane |
Promise.allSettled |
Wszystko się rozstrzyga | Nigdy | Chcesz każdego wyniku |
Promise.race |
Pierwszy, który się osiedli, spełnia | Pierwszy, który rozstrzygnie, odrzuca | Limity czasu |
Promise.any |
Spełnia się pierwsze | Wszyscy odrzucają | Pierwsze udane źródło |
Aby je przetestować, użyliśmy dwóch małych pomocników, jednego, który odniósł sukces po opóźnieniu i drugiego, który zakończył się niepowodzeniem po opóźnieniu:
const wait = (ms, value) =>
new Promise((resolve) => setTimeout(() => resolve(value), ms));
const fail = (ms, message) =>
new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));
Promise.all
await Promise.all([wait(300, "a"), wait(100, "b"), wait(200, "c")]);
// [ 'a', 'b', 'c' ] took about 300 ms
Warto zwrócić uwagę na dwa szczegóły. Wyniki zachowują kolejność wprowadzania, mimo że b zakończył pracę jako pierwszy. A całkowity czas wyniósł około 300 ms, czas najwolniejszego zadania, a nie suma 600 ms, ponieważ wszystkie trzy były już uruchomione na raz. Jeśli któryś z nich odrzuci, cała rzecz od razu się odrzuci:
await Promise.all([wait(100, "a"), fail(50, "b failed")]);
// rejected: b failed
Promise.allSettled
To czeka na wszystko i raportuje każdy wynik, więc jedna awaria nie powoduje utraty pozostałych. Pasuje do dashboardu, w którym każdy widget ładuje się niezależnie:
const results = await Promise.allSettled([wait(50, "a"), fail(50, "b failed")]);
results.map((r) => r.status);
// [ 'fulfilled', 'rejected' ]
Promise.race i Promise.any
await Promise.race([wait(300, "slow"), wait(100, "fast")]); // fast
await Promise.any([fail(50, "x"), wait(100, "ok")]); // ok
Różnica polega na tym, że race musi rozstrzygnąć pierwszy, nawet jeśli się nie powiedzie, podczas gdy any ignoruje niepowodzenia, o ile coś się powiedzie. Klasycznym zastosowaniem race jest dodanie limitu czasu do powolnego żądania, chociaż wolniejsze zadanie będzie nadal działać w tle, chyba że je anulujesz.
Obietnice i asynchronizacja/czekanie
async i await to bardziej czytelny sposób pracy z tymi samymi obietnicami. Funkcja async zawsze zwraca obietnicę, a await wstrzymuje tę funkcję do czasu spełnienia obietnicy:
async function showInvoice(id) {
try {
const user = await getUser(id);
const orders = await getOrders(user.id);
console.log(orders.length);
} catch (error) {
console.log("Failed:", error.message);
}
}
Odrzucenia stają się błędami zgłaszanymi, więc zwykłe try i catch działają. Nadal potrzebujesz Promise.all do pracy równoległej, ponieważ oczekiwanie na jedno wywołanie po drugim uruchamia je po kolei. Nasz przewodnik po asynchronizacji/oczekiwaniu JavaScript omawia tę kwestię głębiej.
Obietnice i pętla zdarzeń
Osoby zajmujące się obsługą obietnic nigdy nie są wywoływane natychmiast, nawet jeśli obietnica została już rozliczona. Uruchamiają się po zakończeniu bieżącego kodu i przed jakimkolwiek licznikiem czasu. Oto dowód:
setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("microtask"));
console.log("sync");
// sync
// microtask
// timeout
Kod synchroniczny działa jako pierwszy. Następna jest kolejka mikrozadań, w której znajdują się procedury obsługi obietnic. Dopiero wtedy pętla zdarzeń przejmuje następne zadanie, np. licznik czasu. To popularne pytanie podczas rozmów kwalifikacyjnych, które wyjaśnia, dlaczego setTimeout zero nie jest tak naprawdę natychmiastowe.
Obietnice a wywołania zwrotne
| Troska | Oddzwonienia | Obietnice |
|---|---|---|
| Sekwencjonowanie | Zagnieżdżone, z każdym krokiem głębsze | Płaski łańcuszek |
| Błędy | Sprawdzone na każdym poziomie | Jeden catch może zakryć łańcuch |
| Praca równoległa | Liczniki ręczne | Promise.all |
| Zadzwoniłeś dwa razy przez pomyłkę? | Możliwe | Nie można rozstrzygnąć dwa razy |
Typowe błędy
- Zapominając wrócić do środka
then. Bezreturnnastępny krok otrzymujeundefinedi nie czeka na Twoją wewnętrzną obietnicę. - W ogóle nie
catch. Powoduje to nieobsłużone odrzucenie, a w Node.js domyślnie zatrzymuje proces. - Zagnieżdżanie zamiast łączenia. Umieszczenie
thenwewnątrzthenodtwarza piekło wywołań zwrotnych. Zwróć obietnicę i kontynuuj łańcuch. - Zawijanie obietnicy w
new Promise. Jeśli funkcja już zwraca obietnicę, po prostu jej użyj. - Używanie
forEachz asynchronicznymi wywołaniami zwrotnymi. To nie czeka. Użyjfor...oflubPromise.allzmap, jak pokazano w naszym przewodniku po metodach tablicowych JavaScript. - Myślenie, że obietnicę można anulować. Sama nie jest w stanie tego zrobić. W przypadku żądań użyj
AbortController.
Podsumowanie
Obietnice sprowadzają się do kilku zasad: obietnica zostaje spełniona raz, then zwraca nową obietnicę, a błędy przechodzą w dół łańcucha, aż coś je złapie. Kiedy te zasady staną się naturalne, async i await przestaną być magią. Aby poćwiczyć, przepisz jedną funkcję opartą na wywołaniu zwrotnym, używając obietnic, a następnie pobierz dwa punkty końcowe za pomocą Promise.all i poprawnie obsłuż błąd.
Najczęstsze pytania
Co to jest obietnica w JavaScript?
Obietnica to obiekt reprezentujący ostateczny wynik pracy asynchronicznej. Zaczyna się jako oczekujące, następnie albo spełnia wartość, albo odrzuca z podaniem powodu.
Jaka jest różnica między theni catch?
następnie działa, gdy obietnica się spełni, a catch działa, gdy zostanie odrzucona. catch działa wtedy efektywnie tylko z procedurą obsługi odrzucenia i może także przechwytywać błędy zgłoszone we wcześniejszych krokach.
Jaka jest różnica między Promise.all a Promise.allSettled?
Obietnica.wszystko odrzuca, gdy tylko jedna obietnica zostaje odrzucona. Promise.allSettled zawsze czeka na każdego z nich i raportuje status, wartość lub powód każdego z nich.
Czy powinienem używać obietnic czy asynchronizacji/oczekiwania?
Współpracują ze sobą, ponieważ oczekiwanie opiera się na obietnicach. Większość kodu czyta się najlepiej przy użyciu async/await, podczas gdy Promise.all i podobne metody pozostają przydatne do pracy równoległej.
Czy obietnice działają równolegle?
JavaScript uruchamia w wątku po jednym fragmencie kodu, ale działa tak, jakby żądania sieciowe odbywały się w tle. Kilka z nich może być prowadzonych jednocześnie.
Ucz się dalej
Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć
Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…
Przeczytaj artykuł →DevOpsWyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo
Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429
Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …
Przeczytaj artykuł →Automatyzacja testówWyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią
Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…
Przeczytaj artykuł →Testowanie oprogramowaniaWyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%
Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…
Przeczytaj artykuł →Bazy danych i SQLDELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich
DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami
Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…
Przeczytaj artykuł →Tworzenie oprogramowaniaInterfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora
Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…
Przeczytaj artykuł →Tworzenie oprogramowaniaPython *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami
Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…
Przeczytaj artykuł →Tworzenie oprogramowaniaFunkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać
Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…
Przeczytaj artykuł →Sztuczna inteligencjaKim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić
Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…
Przeczytaj artykuł →DevOpsMonitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami
Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…
Przeczytaj artykuł →DevOpsWoluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób
Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…
Przeczytaj artykuł →Automatyzacja testówTDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich
TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…
Przeczytaj artykuł →Testowanie oprogramowaniaTestowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady
Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać
Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…
Przeczytaj artykuł →Bazy danych i SQLInstrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy
SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…
Przeczytaj artykuł →Tworzenie oprogramowaniaCo to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania
Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami
Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom
Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …
Przeczytaj artykuł →Sztuczna inteligencjaCzym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa
Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…
Przeczytaj artykuł →DevOpsWdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru
Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…
Przeczytaj artykuł →Automatyzacja testówNiestabilne testy: co je powoduje i jak je naprawić na dobre
Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…
Przeczytaj artykuł →Testowanie oprogramowaniaLoad Testing vs Stress Testing: Differences, Metrics and k6 Examples
Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…
Przeczytaj artykuł →Testowanie oprogramowaniaPrzypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich
Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…
Przeczytaj artykuł →Bazy danych i SQLOptymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją
Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…
Przeczytaj artykuł →Bazy danych i SQLSQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność
SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…
Przeczytaj artykuł →Tworzenie oprogramowaniaSamouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu
Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…
Przeczytaj artykuł →Tworzenie oprogramowaniaObsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami
Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…
Przeczytaj artykuł →Tworzenie oprogramowaniaKlasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami
Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …
Przeczytaj artykuł →Sztuczna inteligencjaCo to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu
Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…
Przeczytaj artykuł →DevOpsPolecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami
Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…
Przeczytaj artykuł →Automatyzacja testówSelenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór
Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…
Przeczytaj artykuł →Testowanie oprogramowaniaPartycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach
Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…
Przeczytaj artykuł →Testowanie oprogramowaniaWażność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady
Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…
Przeczytaj artykuł →Bazy danych i SQLSamouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami
Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji
Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…
Przeczytaj artykuł →Tworzenie oprogramowaniaŚciągawka dotycząca poleceń Git: polecenia, których faktycznie używasz, z przykładami
Ściągawka poleceń Git pogrupowana według zadań: konfiguracja, przemieszczanie, gałęzie, piloty, skrytka, historia i cofanie błędów, z danymi wyjścio…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie obietnic JavaScript: następnie catch, Promise.all i typowe błędy
Obietnice JavaScript wyjaśnione za pomocą uruchomionego przez nas kodu: stany, łańcuchy then i catch, obsługa błędów, Promise.all, allSettled, race …
Przeczytaj artykuł →Tworzenie oprogramowaniaSamouczek słownika języka Python: metody, przykłady i typowe wzorce
Samouczek słownika języka Python z uruchomionym przez nas kodem: tworzenie, odczytywanie i aktualizowanie słowników, metody kluczowych, łączenie, ro…
Przeczytaj artykuł →Sztuczna inteligencjaCo to jest RAG? Generacja rozszerzona o wyszukiwanie wyjaśniona na przykładzie roboczym
Co to jest RAG? Generowanie wspomagane pobieraniem wyjaśnione krok po kroku: indeksowanie, fragmentowanie, osadzanie, pobieranie, mały działający pr…
Przeczytaj artykuł →DevOpsSamouczek Terraform dla początkujących: Infrastruktura jako kod od pierwszego pliku do modułów
Samouczek Terraform dla początkujących: zacznij bez konta w chmurze, naucz się inicjowania, planowania i stosowania, a następnie zmiennych, wyników,…
Przeczytaj artykuł →DevOpsDocker kontra Kubernetes: kluczowe różnice, jak ze sobą współpracują i czego potrzebujesz
Wyjaśniono Docker vs Kubernetes: co robi każdy z nich, ta sama aplikacja działa z obydwoma, porównanie Docker Compose i Swarm, zmiana podkładki dock…
Przeczytaj artykuł →Automatyzacja testówSamouczek Pytest dla początkujących: urządzenia, parametryzacja i prawdziwe przykłady
Samouczek pytest dla początkujących z testami, które przeprowadziliśmy na pytest 9.2: asercje, urządzenia, parametryzacja, conftest, znaczniki, tmp_…
Przeczytaj artykuł →Testowanie oprogramowaniaCykl życia testowania oprogramowania (STLC): 6 faz, kryteria wejścia i wyjścia, przykład
Wyjaśniono cykl życia testowania oprogramowania: sześć faz STLC z kryteriami wejścia i wyjścia, elementy dostarczane, działający przykład funkcji lo…
Przeczytaj artykuł →Tworzenie oprogramowaniaGit merge vs rebase: różnice, przykłady i kiedy czego używać
Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.
Przeczytaj artykuł →Tworzenie oprogramowaniaPython list comprehension: składnia, przykłady i kiedy jej unikać
Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…
Przeczytaj artykuł →Bazy danych i SQLSQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…
Przeczytaj artykuł →