Kontynuujemy poznawanie promises. Piszemy promisy, które zwracają wartość i posiadają resolve/reject – do dzieła.

Nasz poprzedni przykład:

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

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

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

console.log(document.readyState);

Potrzebujemy do tego jeszcze odrobinę HTML:

<body>
    <p id="para">bla bla bla</p>
    <script src="./promise2.js"></script>
</body>

Powinno wyglądać to tak:

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

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

    });
    return p;
}

whenLoaded()
.then(function(){
    console.log("DOCUMENT READY");
});

console.log(document.readyState);
//loading
//DOCUMENT READY

Teraz dodać możemy funkcję wykonującą selekcję po ID:

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

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

    });
    return p;
}

function selectById(selector){
    let p = new Promise(function(resolve, reject){
        let element;
        element = document.getElementById(selector);
        resolve(element);
    });
    return p;
}

Oraz jej użycie:

whenLoaded()
.then(function(){
    console.log("DOCUMENT READY");
    
    selectById("para")
    .then((el) => el.textContent = "MODIFIED")
});

console.log(document.readyState);
//loading
//DOCUMENT READY

Możemy dodać też reject do naszej promise:

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

        let element;
        
        try {
            element = document.getElementById(selector);
            resolve(element);
        } catch(err) {
            reject(err.message);
        }

    });

    return p;
}

Zobaczmy jak działa z błędami:

whenLoaded()
.then(function(){
    console.log("DOCUMENT READY");

    selectById("para")
    .then((el) => el.textContent = 'modified')

    selectById("doesntexist")
    .then((el) => el.textContent = "modified!")
    .catch((err) => console.warn(err));
});