Leveraging .then() in Modern JavaScript

Hero image for Leveraging .then() in Modern JavaScript. Image by Djim Loic.
Hero image for 'Leveraging .then() in Modern JavaScript.' Image by Djim Loic.

In the constantly evolving landscape of JavaScript, it's really important to understand how to handle asynchronous operations. Amongst the many tools available, Prototype.then stands out as a key method for managing promises.

Here, I intend to explore the usage of then(), including some practical examples and scenarios where it proves invaluable in realworld development.


Introducing Prototype.then

The .then() method is a fundamental part of the Promise prototype in JavaScript. It provides a way to handle the eventual completion (or failure) of asynchronous operations, whilst offering a cleaner, more manageable approach to asynchronous code compared to older techniques you may be familiar with like callbacks.

Syntax

promise.then(onFulfilled, onRejected)
  • promise: The Promise object to which .then() is attached.
  • onFulfilled: A function that is called when the Promise successfully resolves.
  • onRejected: A function that is called when the Promise is rejected.

A Basic Example

const myPromise = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('Data fetched successfully');  }, 2000);});myPromise.then(  (data) => console.log(data),  //=> onFulfilled  (error) => console.error(error)  //=> onRejected);

Here, I'm approximating an asynchronous operation in myPromise by using setTimeout. Once the promise is resolved, .then() processes the result.


Real‑World Scenarios

In the realworld, we of course don't synthesise promises and then react to them! So here are a couple of examples where the use of then comes into it's own in modern JavaScript development.

API Calls

Any modern JavaScript application is likely to utilise API calls. I use them fairly extensively behind the scenes even here on my personal website, not least for things like the live weather descriptions, and the contact form. So, it is fair to say that .then() is particularly useful for handling API calls, allowing you to deal with data once it is available:

fetch('https://api.example.com/data')  .then((response) => response.json())  .then((data) => console.log(data))  .catch((error) => console.error('Error:', error));

Here, .then() is used to handle the response from an API call, transforming the response into JSON, and then processing it further.

Chaining Promises

Another key strength of .then() is its ability to chain promises, making it possible to execute a sequence of asynchronous operations in a clear and concise manner one after the other. For example:

getData()  .then((data) => processData(data))  .then((processedData) => displayData(processedData))  .catch((error) => console.error(error));

Each .then() waits for the previous operation to complete before executing, which ensures that the operations occur in the desired order, and when all proceeding data is available and in the required format.


Benefits of Using Prototype.then

  • Improved Readability

    : Compared to nested callbacks, .then() offers a more readable and structured approach to handling asynchronous code.
  • Error Handling

    : It allows centralised and efficient error handling with .catch().
  • Composability

    : Promises can be composed and chained, enhancing the maintainability of the code.

Then() vs. async/await

async and await are often easier to read when asynchronous code has several steps. That does not make .then() obsolete. Promise chains are still useful when you are returning a transformed promise directly, composing small operations or working in a style that benefits from expressionlike flow.

The important thing is consistency. Mixing .then() and await in the same small block can make error handling harder to follow unless there is a clear reason.


Return Values and Errors

A .then() callback returns a new promise. If it returns a value, the next step receives that value. If it throws, the chain moves to the nearest rejection handler. Most mistakes with .then() come from forgetting to return the next promise or catching an error too early and hiding it from the caller.


Wrapping Up

The Prototype.then method is a cornerstone of modern JavaScript development, offering a robust and elegant way to handle asynchronous operations. Its integration into everyday coding practices, from simple data fetching to complex chained operations, underlines its importance in crafting efficient, readable, and maintainable JavaScript code.


Looking for technical direction?

I support teams that need senior judgement on React, Next.js, headless CMS architecture, performance, migrations, and technical SEO.