Przejdź do treści
Ujednolić callback synchroniczny lub asynchroniczny

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Wzorce

    Jak przyjąć callback zwracający `T` albo `Promise<T>` i zawsze wystawić jeden przewidywalny wynik?

    Przyjmij wartość lub obietnicę, oczekaj jej i opisz spłaszczony wynik przez `Awaited`.

    Przepis

    type MaybePromise<T> = T | Promise<T>
    
    async function run<T>(
      task: () => MaybePromise<T>,
    ): Promise<Awaited<T>> {
      return (await task()) as Awaited<T>
    }
    
    const syncResult = run(() => 42)
    const asyncResult = run(async () => 'ready')

    Build to kompiluje i sprawdza każdy wynik poniżej.

    Jak to działa

    1. 01
      type MaybePromise<T> = T | Promise<T>

      Kontrakt callbacku dopuszcza implementacje natychmiastowe i odroczone.

    2. 02
      Promise<Awaited<T>>

      Publiczny wynik jest zawsze asynchroniczny, a zagnieżdżone obietnice są spłaszczane.

    Co dostajesz

    Gdzie to zawodzi

    Zwracane API jest zawsze asynchroniczne, nawet dla synchronicznego callbacku. Nie używaj tej otoczki, gdy wywołujący polegają na natychmiastowych wyjątkach lub zakończeniu w tym samym takcie.

    Wniosek

    Ujednolicaj elastyczne wejścia na granicy, by każdy wywołujący konsumował jeden stabilny kształt wyniku.

    Zobacz też

    Wzorce