Klasa Promise w TypeScript

Klasa Promise w TypeScript

W tym artykule wyjaśniamy klasę Promise w TypeScript.

YouTube Video

Promise

Klasa Promise w TypeScript jest zasadniczo taka sama jak Promise w JavaScript. Promise to wbudowana klasa do obsługi operacji asynchronicznych, reprezentująca wynik operacji asynchronicznej po jej zakończeniu. Tutaj wyjaśniamy podstawowe zastosowania Promises oraz związane z nimi pojęcia.

Podstawowe użycie

Tworzenie Promise:

Obiekt Promise jest używany do opakowywania operacji asynchronicznych. Promise tworzy się za pomocą new Promise(executor), wykonując wewnątrz niego operacje asynchroniczne. „executor” przyjmuje dwie funkcje, „resolve” i „reject”, jako argumenty.

1const myPromise = new Promise<number>((resolve, reject) => {
2    // Perform asynchronous operations
3    const success = true; // This is just an example
4    if (success) {
5        resolve(42); // In case of success
6    } else {
7        reject('Failed'); // In case of failure
8    }
9});

Korzystanie z Promise:

Stworzony Promise jest obsługiwany za pomocą metod then() i catch().

1myPromise.then((value) => {
2    console.log(`Success: ${value}`); // Process the value passed with resolve
3}).catch((error) => {
4    console.error(`Error: ${error}`); // Handle the error passed with reject
5});

finally() metoda

 1const myPromise = new Promise<number>((resolve, reject) => {
 2    // Perform asynchronous operations
 3    const success = false; // This is just an example
 4    if (success) {
 5        resolve(42); // In case of success
 6    } else {
 7        reject('Failed'); // In case of failure
 8    }
 9});
10
11myPromise.then((value) => {
12    console.log(`Success: ${value}`); // Process the value passed with resolve
13}).catch((error) => {
14    console.error(`Error: ${error}`); // Handle the error passed with reject
15}).finally(() => {
16    console.log('The operation has completed');
17});
  • Metoda finally() definiuje kod, który zostanie wykonany niezależnie od tego, czy Promise zostanie spełniony, czy odrzucony.

Łączenie Promises:

Łącząc then() po then(), można połączyć wiele operacji asynchronicznych w szereg.

 1const myPromise = new Promise<number>((resolve, reject) => {
 2    // Perform asynchronous operations
 3    const success = true; // This is just an example
 4    if (success) {
 5        resolve(42); // In case of success
 6    } else {
 7        reject('Failed'); // In case of failure
 8    }
 9});
10
11myPromise
12    .then((value) => {
13        console.log(`Success: ${value}`);
14        return value + 1; // Pass the value to the next then
15    })
16    .then((newValue) => {
17        console.log(`New value: ${newValue}`);
18    })
19    .catch((error) => {
20        console.error(`Error: ${error}`);
21    });

async/await:

W TypeScript można obsługiwać Promises w sposób bardziej bezpośredni, używając async/await. W funkcji oznaczonej jako async można użyć słowa kluczowego await, aby poczekać na wynik Promise.

 1const myPromise = new Promise<number>((resolve, reject) => {
 2    // Perform asynchronous operations
 3    const success = true; // This is just an example
 4    if (success) {
 5        resolve(42); // In case of success
 6    } else {
 7        reject('Failed'); // In case of failure
 8    }
 9});
10
11async function asyncFunction() {
12    try {
13        const value = await myPromise;
14        console.log(`Success: ${value}`);
15    } catch (error) {
16        console.error(`Error: ${error}`);
17    }
18}
19
20asyncFunction();

Metody Promise

Promise.all()

Promise.all wykonuje wiele obietnic jednocześnie i czeka, aż wszystkie zostaną spełnione.

 1const promise1 = Promise.resolve(1);
 2const promise2 = Promise.resolve(2);
 3const promise3 = Promise.resolve(3);
 4
 5Promise.all([promise1, promise2, promise3])
 6    .then((results) => {
 7        console.log(results);  // [1, 2, 3]
 8    })
 9    .catch((error) => {
10        console.error('Error :', error);
11    });
  • then() jest wywoływane tylko wtedy, gdy wszystkie Promises zostaną spełnione. catch() jest wywoływane, jeśli choć jedna z obietnic zakończy się niepowodzeniem.

Promise.race()

Promise.race zwraca wynik pierwszej Promise, która zakończy się spośród wielu obietnic.

1const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
2const promise2 = new Promise((resolve) => setTimeout(resolve, 500, 'Second'));
3
4Promise.race([promise1, promise2]).then((result) => {
5    console.log(result);  // "First"
6});
  • Tak jak w tym przykładzie, zwracany jest wynik pierwszej obietnicy, która się zakończy.

Promise.allSettled()

Promise.allSettled czeka, aż wszystkie obietnice się zakończą, i zwraca tablicę wyników, zarówno spełnionych, jak i odrzuconych.

 1const promise1 = Promise.resolve(1);
 2const promise2 = Promise.reject("Failed");
 3const promise3 = Promise.resolve(3);
 4
 5Promise.allSettled([promise1, promise2, promise3])
 6    .then((results) => {
 7        results.forEach(result => console.log(result));
 8        // [
 9        //   { status: 'fulfilled', value: 1 },
10        //   { status: 'rejected', reason: 'Failed' },
11        //   { status: 'fulfilled', value: 3 }
12        // ]
13    });
  • then() jest wywoływane, gdy wszystkie obietnice zostaną zakończone (spełnione lub odrzucone). Każdy wynik zawiera właściwość status ('fulfilled' lub 'rejected'). Niepowodzenia nie wpływają na pozostałe operacje.

Promise.any()

Promise.any czeka na spełnienie pierwszej obietnicy i ją zwraca.

 1const promise1 = new Promise((resolve) => setTimeout(() => resolve("A ok"), 300));
 2const promise2 = new Promise((_, reject) => setTimeout(() => reject("B fail"), 100));
 3const promise3 = new Promise((resolve) => setTimeout(() => resolve("C ok"), 200));
 4
 5Promise.any([promise1, promise2, promise3])
 6    .then(value => {
 7        // Logs the first fulfilled value ("C ok")
 8        console.log("first fulfilled:", value);
 9    })
10    .catch(err => {
11        console.log("should not reach here in this example:", err);
12    });
  • Zwraca pierwszą spełnioną wartość spośród wielu obietnic.

Podsumowanie

Używając TypeScript, można odpowiednio określić typy Promises, co pozwala pisać bardziej bezpieczne typowo programy. Pozwala to na wcześniejsze wychwytywanie błędów podczas tworzenia aplikacji, określając z góry typ wartości zwracanej przez Promise.

Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.

YouTube Video