Poznajemy promises w JavaScript. Uczymy się tworzyć funkcje zwracające promise. Do dzieła.

Wzór na funkcje zwracające promisy jest bardzo prosty:

function invokeWhenLoaded(){
    let p = new Promise(function(resolve, reject){
        //(...)
    });
    return p;
}

Resolve wywołujemy gdy sukces z wartością, jaką chcemy przekazać, reject gdy fail.

Teraz napiszmy sobie naszą funkcję:

function invokeWhenLoaded(){
    let p = new Promise(function(resolve, reject){
        document.addEventListener('DOMContentLoaded', function(){
            resolve(true);
        });
    });
    return p;
}

Ta funkcja ma chodzić, gdy DOM się załaduje:

invokeWhenLoaded()
.then(() => console.log("DOM LOADED"))
.then(() => console.log(document.querySelector("#para")));

console.log(document.readyState);

Najpierw zobaczymy, że stan to loading, później wykona bloki then, gdy już DOM będzie załadowany.

Wartość przekazana do resolve nie jest tu używana, ale możemy ją sobie wyświetlić:

invokeWhenLoaded()
.then((val) => console.log(val))
.then(() => console.log("DOM LOADED"))
.then(() => console.log(document.querySelector("#para")));

console.log(document.readyState);

Ok, teraz napiszmy sobie jeszcze nasze promise bez event-listenera:

function invokeWhenLoaded(){
    let p = new Promise(function(resolve, reject){

    let stateCheck = setInterval(() => {
        if (document.readyState === 'complete') {
              clearInterval(stateCheck);
              resolve(true);
            }
        }, 100);
        
    });
    return p;
}

Działa dokładnie tak samo.