A pattern very used at the beginning of Node.js was the Callback pattern. This pattern was the first way to resolve the asynchronism of the javascript single thread.
Look at a fake example below:
function getUserCallback(id, callback) { setTimeout(function () { callback(null, { id, name: 'Gabriel Rufino' }) }, 2000) } getUserCallback(1234, function (error, user) { if (!error) { console.log(user) } })
Fortunately, today we have Promises and the lovely duo async/await
to treat the asynchronous flow more elegantly.
The same function getUser
using Promise
:
function getUserPromise(id) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve({ id, name: 'Gabriel Rufino' }) }, 2000) }) } getUserPromise(1234) .then(function (user) { console.log(user) }) .catch(function (error) { console.error(error) })
But not everything is perfect. There's a lot of functions or npm packages that work only with the callback approach. Hopefully, the Node.js has built-in util that helps us to transform functions that receive a callback
as an argument to a function that returns a Promise
.
It's the util.promisify
helper:
const util = require('util') const functionPromise = util.promisify(/* Function here */)
Look at an example of transforming:
const { promisify } = require('util') const getUserCallback = require('./getUserCallback') getUserCallback(1234, function (error, user) { if (!error) { console.log(user) } }) const getUserPromise = promisify(getUserCallback) getUserPromise(1234) .then(function (user) { console.log(user) }) .catch(function (error) { console.log(error) })
Important: The function must follow the callback pattern
- The callback must be the last argument
- The first argument of the callback must be the possible error
That's it! Thank you :D
Top comments (0)