Sling Academy
Home/JavaScript/Handling Multiple Data Sources Using JavaScript Classes

Handling Multiple Data Sources Using JavaScript Classes

Last updated: December 12, 2024

In modern web development, it's common to deal with multiple data sources simultaneously. This can include APIs, databases, and local files, among others. Managing these sources efficiently is crucial, and JavaScript classes provide a robust solution to organize and abstract the process. In this article, we'll explore how to handle multiple data sources using JavaScript classes.

Understanding JavaScript Classes

JavaScript ES6 introduced classes, which are syntactic sugar over JavaScript's existing prototype-based inheritance. Classes make it easier to create objects and manage inheritance. The structure is cleaner and more intuitive than the old function-based syntax.

class Vehicle {
  constructor(type) {
    this.type = type;
  }

  describe() {
    return `This vehicle is a ${this.type}`;
  }
}

const car = new Vehicle('car');
console.log(car.describe()); // Outputs: This vehicle is a car

Working with Multiple Data Sources

Let's consider three different data sources: a remote API providing user information, a database for product details, and a local JSON file for configuration settings. We'll define a class for each data source to encapsulate related logic.

User API Class

This class will handle HTTP requests to an external API to fetch user data. Using Fetch API, it's straightforward to abstract the data retrieval process inside a class.

class UserAPI {
  constructor(baseURL) {
    this.baseURL = baseURL;
  }

  async getUser(userId) {
    const response = await fetch(`${this.baseURL}/users/${userId}`);
    const data = await response.json();
    return data;
  }
}

Creating an instance of the class and fetching a user:

const userAPI = new UserAPI('https://api.example.com');
userAPI.getUser(1).then(user => console.log(user));

Product Database Class

In a real-world application, you might use libraries like Sequelize for ORM. Here's a simplified example using a mock database interaction:

class ProductDatabase {
  constructor() {
    this.products = [
      { id: 1, name: 'Laptop', price: 999 },
      { id: 2, name: 'Phone', price: 499 },
    ];
  }

  getProduct(productId) {
    return this.products.find(product => product.id === productId);
  }
}

Fetch product details:

const productDB = new ProductDatabase();
console.log(productDB.getProduct(1)); // Outputs: { id: 1, name: 'Laptop', price: 999 }

Configuration Settings from a JSON File

Configuration settings are often stored locally. We can abstract the reading of a configuration file using Node.js or simply simulating with a JSON-like object in a browser environment.

class Config {
  constructor() {
    this.settings = {
      theme: 'dark',
      language: 'en',
    };
  }

  getSetting(key) {
    return this.settings[key];
  }
}

Accessing configuration settings:

const config = new Config();
console.log(config.getSetting('theme')); // Outputs: dark

Combining Classes for Data Management

The power of JavaScript classes truly shines when we start to combine classes and cross-utilize data fetched from different sources. For instance, a function utilizing user, product, and configuration data to display a personalized shopping experience might look like this:

async function getShoppingExperience(userId, productId) {
  const userAPI = new UserAPI('https://api.example.com');
  const productDB = new ProductDatabase();
  const config = new Config();

  try {
    const user = await userAPI.getUser(userId);
    const product = productDB.getProduct(productId);
    const theme = config.getSetting('theme');

    return `User ${user.name}, we recommend the ${product.name} for you. The current theme is ${theme}.`;
  } catch (error) {
    console.error('Error fetching shopping experience:', error);
  }
}

Conclusion

JavaScript classes provide an organized way to handle multiple data sources. By encapsulating different kinds of data interactions in separate classes, your code can be more modular, easier to maintain, and more expressive. As your application grows and your data sources increase, having a class-based structure can simplify management and integration efforts.

Next Article: Powering Custom Plugins and Extensions with JavaScript Classes

Previous Article: Scaling Your Frontend Code through JavaScript Class Abstractions

Series: JavaScript Classes

JavaScript

You May Also Like

  • Handle Zoom and Scroll with the Visual Viewport API in JavaScript
  • Improve Security Posture Using JavaScript Trusted Types
  • Allow Seamless Device Switching Using JavaScript Remote Playback
  • Update Content Proactively with the JavaScript Push API
  • Simplify Tooltip and Dropdown Creation via JavaScript Popover API
  • Improve User Experience Through Performance Metrics in JavaScript
  • Coordinate Workers Using Channel Messaging in JavaScript
  • Exchange Data Between Iframes Using Channel Messaging in JavaScript
  • Manipulating Time Zones in JavaScript Without Libraries
  • Solving Simple Algebraic Equations Using JavaScript Math Functions
  • Emulating Traditional OOP Constructs with JavaScript Classes
  • Smoothing Out User Flows: Focus Management Techniques in JavaScript
  • Creating Dynamic Timers and Counters with JavaScript
  • Implement Old-School Data Fetching Using JavaScript XMLHttpRequest
  • Load Dynamic Content Without Reloading via XMLHttpRequest in JavaScript
  • Manage Error Handling and Timeouts Using XMLHttpRequest in JavaScript
  • Handle XML and JSON Responses via JavaScript XMLHttpRequest
  • Make AJAX Requests with XMLHttpRequest in JavaScript
  • Customize Subtitle Styling Using JavaScript WebVTT Integration