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;