Node.js fornisce un'interessante funzione di utility per trasformare alcune funzioni asincrone con callback in funzioni che restituiscono una Promise.

Il metodo util.promisify(original) opera su quelle funzioni o metodi che usano una funzione di callback il cui primo argomento è l'eventuale errore restituito durante l'operazione.

Ad esempio molti metodi del modulo core fs seguono questo approccio.

'use strict';

const fs = require('fs');

fs.readFile('./test.txt', 'utf8', (err, contents) => {
});

Possiamo trasformare il metodo readFile() in questo modo:

'use strict';

const util = require('util');
const fs = require('fs');
const fileRead = util.promisify(fs.readFile);

const init = async () => {
     try {
        let contents = await fileRead('./test.txt', 'utf8');
        console.log(contents.toString());
     } catch(err) {
        console.log(err);
     }
};

Se l'argomento passato a promisify() non è una funzione, verrà sollevato un errore. Se l'argomento passato è una funzione il cui primo argomento non è un errore, verrà comunque passato come ultimo argomento un callback che segue l'approccio error-first.