Uczymy się stosować promises zamiast podejścia error-first na przykładzie odczytu pliku funkcją readFile. Do dzieła!

Na początek nasz przykład odczytu pliku z użyciem error-first:

const fs = require("fs");
const path = require("path");


function readFile(file, cb) {

    fs.readFile(path.join(__dirname, "files", file), function(err, data) {

        if(err) {
            cb(err);
        } else {
            cb(null, data.toString());
        }

    });

}

readFile("lorem.txt", function(err, data){
    if(err){
        console.log("Error!");
    } else {
        console.log("OK. Data: " + data);
    }
});

//OK. Data: lorem ipsum bla bla bla;

Teraz zamienimy sobie tę funkcję na funkcję zwracającą promise:

const fs = require("fs");
const path = require("path");

function readFile(file) {

    var p = new Promise(function(resolve, reject) {

        fs.readFile(path.join(__dirname, "files", file), function(err, data) {

            if(err) {
                reject(err);
            } else {
                resolve( data );
            }
        });
    });
    return p;
}

Przykład użycia:

readFile("lorem.txt")
    .then(function(data) {
        console.log(data);
    })
    .catch(function(err) {
        console.log(`Wystąpił błąd: ${err.message}`);
    });
//<Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 62 6c 61 20 62 6c 61 20 62 6c 61 3b>

Przykład chainowania obiektów thenable:

readFile("lorem.txt")
    .then(function(data) {
        console.log(data);
        return data;
    })
    .then(function(data){
        console.log(data.toString());
    })
    .catch(function(err) {
        console.log(`Wystąpił błąd: ${err.message}`);
    });
    
// <Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 62 6c 61 20 62 6c 61 20 62 6c 61 3b>
// lorem ipsum bla bla bla;