Promisifying Callback-Based APIs in JavaScript
Convert callback APIs to promises with promisify. Here is how and common examples.
Promisifying Callback-Based APIs in JavaScript
Many older APIs (Node.js fs, crypto, browser APIs) are callback-based. You can convert them to promises.
Manual Promisification
function readFileP(path) { return new Promise((resolve, reject) => { fs.readFile(path, "utf8", (err, data) => { if (err) reject(err); else resolve(data); }); }); } readFileP("file.txt") .then((data) => console.log(data)) .catch((err) => console.error(err)); `` ### Generic promisify Function ```js function promisify(fn) { return (...args) => { return new Promise((resolve, reject) => { fn(...args, (err, result) => { if (err) reject(err); else resolve(result); }); }); }; } const readFileP = promisify(fs.readFile); const writeFileP = promisify(fs.writeFile); `` ### Node.js util.promisify ```js const { promisify } = require("util"); const fs = require("fs"); const readFileP = promisify(fs.readFile); readFileP("file.txt", "utf8") .then((data) => console.log(data)); `` ### Node.js Built-in Promise APIs Many Node.js APIs now have promise-based versions: ```js const fs = require("fs/promises"); // or const fs = require("fs").promises; async function main() { const data = await fs.readFile("file.txt", "utf8"); console.log(data); } `` No need to promisify. Use `fs/promises` directly. ### Promisifying setTimeout ```js function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function main() { console.log("wait"); await delay(1000); console.log("done"); } `` Node.js provides `timers/promises`: ```js const { setTimeout: setTimeoutP } = require("timers/promises"); await setTimeoutP(1000); `` ### Promisifying Events ```js const { once } = require("events"); await once(server, "listen"); `` ### The Takeaway Promisify callback APIs with `new Promise` (manual), a generic `promisify` function, or `util.promisify` (Node.js). Many Node.js APIs now have built-in promise versions (`fs/promises`, `timers/promises`). Promisify `setTimeout` with `delay` and events with `events.once`. Use async/await with promisified APIs for clean code.
Return new Promise((resolve, reject) => { callbackApi(args, (err, result) => { if (err) reject(err); else resolve(result); }); }). The callback must follow the error-first convention.
A built-in utility that converts a callback-based function (error-first convention) to a promise-based one. Usage: const readFileP = promisify(fs.readFile). Then use with .then or async/await.
Yes. Use require('fs/promises') or require('fs').promises. These provide promise-based versions of fs methods (readFile, writeFile, etc.). No need to promisify manually.
function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }. Then use await delay(1000) to pause. Node.js provides timers/promises with setTimeoutP for this.
Use new Promise with emitter.once: new Promise((resolve, reject) => { emitter.once(event, resolve); emitter.once('error', reject); }). Node.js provides events.once(emitter, event) for this.
Ready to master React completely?
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course to dive deeper with high-quality video tutorials, solve interview questions, and a premium community.
Master React
Want to upskill yourself, crack your next interview, and get your dream job? Join our comprehensive course.

