// https://javascript.info/promise-basics

/*
    The function passed to Promise is called "executor". When Promise gets
    created, the executor gets executed.
    When the Promise ends, it should either call the "resolve" or "reject"
    callbacks:
    resolve(value) — if the job is finished successfully, with result value.
    reject(error) — if an error has occurred, error is the error object.

    Remember that Promises are not intrensically asyncronous
*/
const promise = new Promise(function (resolve, reject) {
  setTimeout(() => resolve('done'), 500);
});

/*
    The first argument of .then is a function that runs when the promise is resolved and receives the result.
    The second argument of .then is a function that runs when the promise is rejected and receives the error.
*/
promise.then(
  result => console.log('The operation was successful. It returned ' + result),
  error => console.log('The operation was not successful: ' + error)
);

/*
    Or we can pass only one argument if we're interested only in a positive result
*/
promise.then(
  result => console.log('The operation was successful. It returned ' + result)
);

/*
    Or we can pass only one argument to the method "catch" if we're interested
    in negative results only.

    promise.catch internally just calls promise.then(null, f)
*/
promise.catch(
  error => console.log(error)
);

/*
    finally gets always called
*/
promise.finally(
  () => console.log('The execution has terminated. Bye')
);