Javascript Promises

In Javascript, using async/await is a cleaner approach compared to use of callbacks. Occasionally, you run into useful but older modules that you’d like to use in the more modern way.

Take fluent-ffmpeg, a 10 year old package that uses callbacks to handle various events like start, progress, end and error.

Using callbacks, we have code that looks like this:

const ffmpeg = require('fluent-ffmpeg');
function convertVideo(inputPath, outputPath, callback) {
ffmpeg(inputPath)
.output(outputPath)
.on('end', () => {
console.log('Conversion finished successfully.');
callback(null, 'success'); // Pass 'success' string to callback
})
.on('error', (err) => {
console.error('Error occurred:', err);
callback(err);
})
.run();
}
// Usage of the convertVideo function with a callback to receive 'success' string
convertVideo('/path/to/input.avi', '/path/to/output.mp4', (error, result) => {
if (!error && result === 'success') {
console.log('Video conversion completed:', result);
} else {
console.log('Video conversion failed:', error);
}
});

Using a promise, we use async/await as well:

const ffmpeg = require('fluent-ffmpeg');
function convertVideo(inputPath, outputPath) {
return new Promise((resolve, reject) => {
ffmpeg(inputPath)
.output(outputPath)
.on('end', () => {
console.log('Conversion finished successfully.');
resolve('success'); // Resolve the promise with 'success' string
})
.on('error', (err) => {
console.error('Error occurred:', err);
reject(err);
})
.run();
});
}
// Async function to use the Promise-based conversion function
async function main() {
try {
const result = await convertVideo(
'/path/to/input.avi',
'/path/to/output.mp4'
);
console.log('Video conversion completed:', result);
} catch (err) {
console.error('Video conversion failed:', err);
}
}
// Run the async function
main();

With the approach using a promise, we gain the ability to use this callback-based library with more traditional flow control.