Exercise 1: Fetch Data from an API

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

Exercise 2: Handle Errors

fetch('https://jsonplaceholder.typicode.com/todos/99999')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

Exercise 3: Chaining Promises

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json())
  .then(postData => {
    return fetch('https://jsonplaceholder.typicode.com/users/1')
      .then(response => response.json())
      .then(userData => {
        console.log('Post Data:', postData);
        console.log('User Data:', userData);
      });
  })
  .catch(error => console.error('Error:', error));

Exercise 4: Promise.all

const fetchPost = fetch('https://jsonplaceholder.typicode.com/posts/1').then(response => response.json());
const fetchUser = fetch('https://jsonplaceholder.typicode.com/users/1').then(response => response.json());

Promise.all([fetchPost, fetchUser])
  .then(([postData, userData]) => {
    console.log('Post Data:', postData);
    console.log('User Data:', userData);
  })
  .catch(error => console.error('Error:', error));

Exercise 5: Async/Await

async function fetchData() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

fetchData();

Exercise 6: Error Handling with Async/Await

async function fetchData() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/99999');
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

fetchData();

Exercise 7: Fetch and Render

HTML:

<button id="fetchButton">Fetch Data</button>
<div id="output"></div>

JavaScript:

const fetchButton = document.getElementById('fetchButton');
const outputDiv = document.getElementById('output');

fetchButton.addEventListener('click', () => {
  fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => response.json())
    .then(data => {
      outputDiv.textContent = JSON.stringify(data, null, 2);
    })
    .catch(error => {
      console.error('Error:', error);
      outputDiv.textContent = 'An error occurred.';
    });
});

Exercise 8: Loading Indicator

HTML:

<button id="fetchButton">Fetch Data</button>
<div id="loadingIndicator" style="display: none;">Loading...</div>
<div id="output"></div>

JavaScript:

const fetchButton = document.getElementById('fetchButton');
const loadingIndicator = document.getElementById('loadingIndicator');
const outputDiv = document.getElementById('output');

fetchButton.addEventListener('click', () => {
  loadingIndicator.style.display = 'block';

  fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => response.json())
    .then(data => {
      outputDiv.textContent = JSON.stringify(data, null, 2);
    })
    .catch(error => {
      console.error('Error:', error);
      outputDiv.textContent = 'An error occurred.';
    })
    .finally(() => {
      loadingIndicator.style.display = 'none';
    });
});

Exercise 9: Pagination

HTML:

<button id="prevButton">Previous</button>
<button id="nextButton">Next</button>
<div id="output"></div>

JavaScript:

let currentPage = 1;

function fetchData(page) {
  fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}`)
    .then(response => response.json())
    .then(data => {
      document.getElementById('output').textContent = JSON.stringify(data, null, 2);
    })
    .catch(error => {
      console.error('Error:', error);
      document.getElementById('output').textContent = 'An error occurred.';
    });
}

document.getElementById('prevButton').addEventListener('click', () => {
  if (currentPage > 1) {
    currentPage--;
    fetchData(currentPage);
  }
});

document.getElementById('nextButton').addEventListener('click', () => {
  currentPage++;
  fetchData(currentPage);
});

Exercise 10: Data Post Processing

fetch('https://jsonplaceholder.typicode.com/posts')
  .then(response => response.json())
  .then(posts => {
    // Filter posts with userId 1
    const filteredPosts = posts.filter(post => post.userId === 1);
    
    // Sort posts by title
    filteredPosts.sort((a, b) => a.title.localeCompare(b.title));

    console.log('Filtered and Sorted Posts:', filteredPosts);
  })
  .catch(error => console.error('Error:', error));