DEV Community

Prashanth K.S
Prashanth K.S

Posted on

Synchronous vs Asynchronous in JavaScript Functions

JavaScript is single-threaded, meaning it executes one task at a time. However, it supports asynchronous programming to handle tasks efficiently. Let’s break it down:


1. Synchronous Functions (Blocking)

In synchronous execution, JavaScript runs code line by line, waiting for each operation to complete before moving to the next one.

Example of Synchronous Code

console.log("Start");

function syncFunction() {
    console.log("Processing...");
}

syncFunction();

console.log("End");
Enter fullscreen mode Exit fullscreen mode

Output

Start
Processing...
End
Enter fullscreen mode Exit fullscreen mode

✔️ Each statement executes sequentially.

❌ If one operation takes time (like reading a file), it blocks further execution.

Problem with Synchronous Code

If a function takes too long (e.g., fetching data from a server), the entire program pauses until it’s done, making the app unresponsive.


2. Asynchronous Functions (Non-Blocking)

Asynchronous execution allows JavaScript to continue running other tasks without waiting for long-running operations to finish.

How Does It Work?

  • JavaScript delegates long tasks (like fetching data, reading files) to the Web APIs or Node.js APIs.
  • Once the task is complete, JavaScript resumes execution using callbacks, promises, or async/await.

Example of Asynchronous Code

console.log("Start");

setTimeout(() => {
    console.log("Processing...");
}, 2000); // Executes after 2 seconds

console.log("End");
Enter fullscreen mode Exit fullscreen mode

Output

Start
End
Processing... (after 2 seconds)
Enter fullscreen mode Exit fullscreen mode

✔️ The setTimeout() function executes after 2 seconds, while the rest of the code continues running.

✔️ JavaScript doesn’t block execution, improving efficiency.


3. Differences Between Synchronous & Asynchronous Execution

Feature Synchronous (Blocking) Asynchronous (Non-Blocking)
Execution Line by line Moves to the next task while waiting
Performance Slower (blocks execution) Faster (non-blocking)
Use Case Simple operations Fetching data, API calls, file handling
Example Normal functions Callbacks, Promises, async/await

4. Asynchronous Handling Methods

4.1 Callbacks (Old Approach)

A function is passed as an argument and executes after a task is completed.

console.log("Start");

function fetchData(callback) {
    setTimeout(() => {
        console.log("Data Fetched");
        callback();
    }, 2000);
}

fetchData(() => {
    console.log("Process Completed");
});

console.log("End");
Enter fullscreen mode Exit fullscreen mode

Output:

Start
End
Data Fetched (after 2s)
Process Completed
Enter fullscreen mode Exit fullscreen mode

Callback Hell: Nesting too many callbacks makes the code hard to read and maintain.


4.2 Promises (Better Approach)

A Promise represents a future value that can be fulfilled or rejected.

console.log("Start");

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data Fetched");
        }, 2000);
    });
}

fetchData().then((data) => {
    console.log(data);
});

console.log("End");
Enter fullscreen mode Exit fullscreen mode

✔️ More readable than callbacks.

✔️ Supports .then() and .catch() for error handling.


4.3 Async/Await (Best Approach)

The async/await syntax makes asynchronous code look synchronous and more readable.

console.log("Start");

async function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("Data Fetched");
        }, 2000);
    });
}

async function processData() {
    console.log("Processing...");
    let data = await fetchData(); // Waits here until the promise resolves
    console.log(data);
    console.log("Process Completed");
}

processData();

console.log("End");
Enter fullscreen mode Exit fullscreen mode

✔️ Easy to read and maintain

✔️ Avoids callback hell


5. When to Use Synchronous vs Asynchronous?

Use Synchronous for:

  • Simple tasks like calculations or updating UI.
  • Small scripts where blocking is not an issue.

Use Asynchronous for:

  • API calls (fetching data from a server).
  • Database operations (saving/loading data).
  • File reading/writing (to prevent UI freezing).
  • Real-time applications (like chat apps, stock trading apps).

Conclusion

🔹 Synchronous code runs sequentially and blocks execution.

🔹 Asynchronous code allows JavaScript to handle multiple tasks without waiting, improving efficiency.

🔹 Use Promises or async/await for better readability and performance.

🚀 Modern JavaScript applications mostly rely on asynchronous execution for better speed and responsiveness.

Top comments (0)