Node Callback vs Promise vs Await
const ERR = null;
// const ERR = new Error('erro teste');
// ---------------------------------------------------------------
// 0. Synchronous function
// ---------------------------------------------------------------
function synchronousFunction(param) {
if (ERR) {
throw ERR;
}
console.log(`synchronousFunction: ${param}`);
return param;
}
try {
var result = synchronousFunction('0')
console.log(`synchronousFunction:result: ${result}`);
} catch(err) {
console.log(`synchronousFunction:err: ${err}`);
}
// ---------------------------------------------------------------
// 1. Callback Function
// ---------------------------------------------------------------
function callbackFunction(param, cb) {
if (ERR) {
return cb(ERR);
}
console.log(`callbackFunction: ${param}`);
return cb(null, param);
}
callbackFunction('1', function(err, result) {
if (err) {
console.log(`callbackFunction:err: ${err}`);
return;
}
console.log(`callbackFunction:result: ${result}`);
})
// ---------------------------------------------------------------
// 2. Promise Function
// ---------------------------------------------------------------
function promiseFunction(param) {
return new Promise(function(resolve, reject) {
if (ERR) {
return reject(ERR);
}
console.log(`promiseFunction: ${param}`);
return resolve(param);
});
}
promiseFunction('2')
.then(function(result) {
console.log(`promiseFunction:result: ${result}`);
})
.catch(function(err) {
console.log(`promiseFunction:err: ${err}`);
})
// ---------------------------------------------------------------
// 3. Await Function
// ---------------------------------------------------------------
async function awaitFunction(param) {
if (ERR) {
throw ERR;
}
console.log(`awaitFunction: ${param}`);
return param;
}
// async function returns a promise
awaitFunction('3')
.then(function(result) {
console.log(`awaitFunction:result: ${result}`);
})
.catch(function(err) {
console.log(`awaitFunction:err: ${err}`);
})
// To use await you need to be inside an async function
// However the interpreter of this editor (of runkit) does not work that way
// (async function () {
try {
var result = await awaitFunction('3.1')
console.log(`awaitFunction:result: ${result}`);
} catch (err) {
console.log(`awaitFunction:err: ${err}`);
}
// })()
// Any function that returns a promise can use await
try {
var result = await promiseFunction('3.2')
console.log(`promiseFunction:result: ${result}`);
} catch (err) {
console.log(`promiseFunction:err: ${err}`);
}
// ---------------------------------------------------------------
// 4. Callback Function to Promise Function
// ---------------------------------------------------------------
function callbackToPromise(param) {
return new Promise(function(resolve, reject) {
callbackFunction(param, function(err, result) {
return err? reject(err) : resolve(result);
});
});
}
try {
var result = await callbackToPromise('4')
console.log(`callbackToPromise:result: ${result}`);
} catch (err) {
console.log(`callbackToPromise:err: ${err}`);
}
// ---------------------------------------------------------------
// 5. Promise Function to Callback Function
// ---------------------------------------------------------------
function promiseToCallback(param, cb) {
promiseFunction(param)
.then(function(result) {
return cb(null, result);
}).catch(function(err) {
return cb(err);
});
}
promiseToCallback('5', function(err, result) {
if (err) {
console.log(`promiseToCallback:err: ${err}`);
return;
}
console.log(`promiseToCallback:result: ${result}`);
})
// ---------------------------------------------------------------
// 6. API with both interfaces
// ---------------------------------------------------------------
function bothInterfaces(param, cb = () => {}) {
return new Promise(function(resolve, reject) {
if (ERR) {
cb(ERR)
return reject(ERR);
}
console.log(`duasInterfaces: ${param}`);
cb(null, param)
return resolve(param);
})
}
try {
var result = await bothInterfaces('6')
console.log(`bothInterfaces:result: ${result}`);
} catch (err) {
console.log(`bothInterfaces:err: ${err}`);
}
bothInterfaces('6.1', function(err, result) {
if (err) {
console.log(`bothInterfaces:err: ${err}`);
return;
}
console.log(`bothInterfaces:result: ${result}`);
})
// when used with callback it generates an UnhandledPromiseRejection..
.catch(()=>{})
no comments