%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

% Mehrere Spalten
\usepackage{multicol}

% UML-Diagramme
\usepackage{tikz-uml}


%Kopfzeile
\ihead{JavaScript}
\chead{}
\ohead{https://kohnlehome.de/html/promise-beispiel.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
  \LARGE % Schriftgröße
  \bfseries % Fettdruck
  \sffamily % Serifenlose Schrift
  JavaScript: Promise-Beispiel
\end{center}


\section*{Promise}
\begin{tikzpicture}
    \umlstateinitial[name=start, x=3]
    \begin{umlstate}[x=3, y=-2.5, name=pending, fill=white]{pending}
    \end{umlstate}

    \umltrans{start}{pending}

    \begin{umlstate}[x=0, y=-6, name=fullfilled, fill=white]{fullfilled}
    \end{umlstate}
    
    \begin{umlstate}[x=6, y=-6, name=rejected, fill=white]{rejected}
    \end{umlstate}

    \umltrans[pos=0.4, arg={resolve()}]{pending}{fullfilled}
    \umltrans[arg={reject()}]{pending}{rejected}
\end{tikzpicture}

\section*{Beispiel}
\begin{verbatim}
//------------------------------------
// Funktiondefinitionen
//------------------------------------
function abendessen() {
    console.log('Ich esse zu Abend.');
}

function schlafen() {
    return new Promise((resolve, reject) => {
        console.log('Gut Nacht.');
        console.log('Ich schlafe ...');
        setTimeout(() => {
            console.log('Guten Morgen.');
            resolve(); // beenden
        }, 2000);
    });
}

function fruehstuecken() {
    console.log('Ich frühstücke.');
}

//------------------------------------
// Funktionsaufrufe
// (in package.json: "type": "module")
//------------------------------------
abendessen();
await schlafen(); // Warten, bis resolve oder reject aufgerufen wird
fruehstuecken();
\end{verbatim}

\end{document}
