Promises

What
are Promises

For java dev

Basic Concept

 task (usually async) that can either succeed or fail

//We create a promise
const MyAwesomePromise = CreatePromise();

MyAwesomePromise
    // if Success
    .then((value)=>{
        // We do something

    })
    // if Fail
    .catch((err)=>{
        // We handle the error
    })

Some Code

  • Promise states
  • Then's
  • Resolution procedure

Pyramid of doom

aka callback hell

var fs = require('fs');

var myFile = '/tmp/test';  
fs.readFile(myFile, 'utf8', function(err, txt) {  
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});

Callbacks

var fs = require('fs');

function notifyUser(err) {  
    if(err) return console.log(err);
    console.log('Appended text!');
};

function appendText(err, txt) {  
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, notifyUser);
}

var myFile = '/tmp/test';  
fs.readFile(myFile, 'utf8', appendText); 

Modularize with functions

var fs = require('fs');  
var async = require('async');

var myFile = '/tmp/test';

async.waterfall([  
    function(callback) {
        fs.readFile(myFile, 'utf8', callback);
    },
    function(txt, callback) {
        txt = txt + '\nAppended something!';
        fs.writeFile(myFile, txt, callback);
    }
], function (err, result) {
    if(err) return console.log(err);
    console.log('Appended text!');
});

Use external libs (async.js)

var Promise = require('bluebird');  
var fs = require('fs');  
Promise.promisifyAll(fs);

var myFile = '/tmp/test';  
fs.readFileAsync(myFile, 'utf8').then(function(txt) {  
    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt);
}).then(function() {
    console.log('Appended text!');
}).catch(function(err) {
    console.log(err);
});

Use Promises

const Promise = require('bluebird');  
const fs = require('fs');  
Promise.promisifyAll(fs);

const myFile = '/tmp/test';  
fs.readFileAsync(myFile, 'utf8').then((txt) => {  
    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt);
}).then(() => {
    console.log('Appended text!');
}).catch((err) => {
    console.log(err);
});

Use Promises

var fs = require('fs');

var myFile = '/tmp/test';  
fs.readFile(myFile, 'utf8', function(err, txt) {  
    if (err) return console.log(err);

    txt = txt + '\nAppended something!';
    fs.writeFile(myFile, txt, function(err) {
        if(err) return console.log(err);
        console.log('Appended text!');
    });
});
async function getUser(id) {  
    if (id) {
        return await db.user.byId(id);
    } else {
        throw 'Invalid ID!';
    }
}

try {  
    let user = await getUser(123);
} catch(err) {
    console.error(err);
}

Async/Await

 

deck

By César González González