മലയാളം

ജാവാസ്ക്രിപ്റ്റിന്റെ അബോർട്ട്കൺട്രോളർ ഉപയോഗിച്ച് ഫെച്ച് അഭ്യർത്ഥനകൾ, ടൈമറുകൾ പോലുള്ള അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ റദ്ദാക്കി കോഡ് വൃത്തിയായും മികച്ച പ്രകടനത്തോടെയും നിലനിർത്താൻ പഠിക്കുക.

ജാവാസ്ക്രിപ്റ്റ് അബോർട്ട്കൺട്രോളർ: അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ റദ്ദാക്കുന്നതിൽ വൈദഗ്ദ്ധ്യം നേടുക

ആധുനിക വെബ് ഡെവലപ്‌മെന്റിൽ, അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ സർവ്വവ്യാപിയാണ്. എപിഐകളിൽ (API) നിന്ന് ഡാറ്റ ലഭ്യമാക്കുക, ടൈമറുകൾ സജ്ജീകരിക്കുക, ഉപയോക്താക്കളുടെ ഇടപെടലുകൾ കൈകാര്യം ചെയ്യുക എന്നിവയെല്ലാം സ്വതന്ത്രമായി പ്രവർത്തിക്കുന്നതും ദീർഘനേരം നീണ്ടുനിൽക്കാൻ സാധ്യതയുള്ളതുമായ കോഡുകളെ ആശ്രയിച്ചിരിക്കുന്നു. എന്നിരുന്നാലും, ഈ പ്രവർത്തനങ്ങൾ പൂർത്തിയാകുന്നതിന് മുമ്പ് അവ റദ്ദാക്കേണ്ട സാഹചര്യങ്ങളുണ്ട്. ഇവിടെയാണ് ജാവാസ്ക്രിപ്റ്റിലെ AbortController ഇൻ്റർഫേസ് സഹായത്തിനെത്തുന്നത്. ഡോം (DOM) പ്രവർത്തനങ്ങൾക്കും മറ്റ് അസിൻക്രണസ് ജോലികൾക്കും റദ്ദാക്കൽ അഭ്യർത്ഥനകൾ സൂചിപ്പിക്കുന്നതിനുള്ള വ്യക്തവും കാര്യക്ഷമവുമായ മാർഗ്ഗം ഇത് നൽകുന്നു.

റദ്ദാക്കലിന്റെ ആവശ്യകത മനസ്സിലാക്കൽ

സാങ്കേതിക വിശദാംശങ്ങളിലേക്ക് കടക്കുന്നതിന് മുമ്പ്, അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ റദ്ദാക്കുന്നത് എന്തുകൊണ്ട് പ്രധാനമാണെന്ന് നമുക്ക് മനസ്സിലാക്കാം. ഈ സാധാരണ സാഹചര്യങ്ങൾ പരിഗണിക്കുക:

അബോർട്ട്കൺട്രോളറും അബോർട്ട്സിഗ്നലും പരിചയപ്പെടുത്തുന്നു

അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ റദ്ദാക്കുന്നതിനുള്ള പ്രശ്നം പരിഹരിക്കാനാണ് AbortController ഇൻ്റർഫേസ് രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്. ഇതിന് രണ്ട് പ്രധാന ഘടകങ്ങളുണ്ട്:

അടിസ്ഥാന ഉപയോഗം: ഫെച്ച് അഭ്യർത്ഥനകൾ റദ്ദാക്കുന്നു

ഒരു fetch അഭ്യർത്ഥന റദ്ദാക്കുന്നതിനുള്ള ലളിതമായ ഒരു ഉദാഹരണത്തിൽ നിന്ന് നമുക്ക് തുടങ്ങാം:


const controller = new AbortController();
const signal = controller.signal;

fetch('https://api.example.com/data', { signal })
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    console.log('Data:', data);
  })
  .catch(error => {
    if (error.name === 'AbortError') {
      console.log('Fetch aborted');
    } else {
      console.error('Fetch error:', error);
    }
  });

// To cancel the fetch request:
controller.abort();

വിശദീകരണം:

  1. നമ്മൾ ഒരു AbortController ഇൻസ്റ്റൻസ് ഉണ്ടാക്കുന്നു.
  2. നമ്മൾ controller-ൽ നിന്ന് അനുബന്ധ AbortSignal നേടുന്നു.
  3. നമ്മൾ signal-നെ fetch ഓപ്ഷനുകളിലേക്ക് കൈമാറുന്നു.
  4. അഭ്യർത്ഥന റദ്ദാക്കണമെങ്കിൽ, നമ്മൾ controller.abort() വിളിക്കുന്നു.
  5. .catch() ബ്ലോക്കിൽ, പിശക് ഒരു AbortError ആണോ എന്ന് നമ്മൾ പരിശോധിക്കുന്നു. അങ്ങനെയാണെങ്കിൽ, അഭ്യർത്ഥന റദ്ദാക്കിയതായി നമുക്കറിയാം.

അബോർട്ട്എറർ (AbortError) കൈകാര്യം ചെയ്യൽ

controller.abort() വിളിക്കുമ്പോൾ, fetch അഭ്യർത്ഥന ഒരു AbortError ഉപയോഗിച്ച് നിരസിക്കപ്പെടും. നിങ്ങളുടെ കോഡിൽ ഈ പിശക് ശരിയായി കൈകാര്യം ചെയ്യേണ്ടത് അത്യാവശ്യമാണ്. അසේയുന്നത് കൈകാര്യം ചെയ്യപ്പെടാത്ത പ്രോമിസ് നിരസിക്കലുകളിലേക്കും അപ്രതീക്ഷിതമായ പെരുമാറ്റത്തിലേക്കും നയിച്ചേക്കാം.

പിശക് കൈകാര്യം ചെയ്യുന്നതിനുള്ള കൂടുതൽ ശക്തമായ ഒരു ഉദാഹരണം ഇതാ:


const controller = new AbortController();
const signal = controller.signal;

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data', { signal });
    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }
    const data = await response.json();
    console.log('Data:', data);
    return data;
  } catch (error) {
    if (error.name === 'AbortError') {
      console.log('Fetch aborted');
      return null; // Or throw the error to be handled further up
    } else {
      console.error('Fetch error:', error);
      throw error; // Re-throw the error to be handled further up
    }  }
}

fetchData();

// To cancel the fetch request:
controller.abort();

അബോർട്ട്എറർ കൈകാര്യം ചെയ്യുന്നതിനുള്ള മികച്ച രീതികൾ:

അബോർട്ട്സിഗ്നൽ ഉപയോഗിച്ച് ടൈമറുകൾ റദ്ദാക്കുന്നു

setTimeout അല്ലെങ്കിൽ setInterval ഉപയോഗിച്ച് സൃഷ്ടിച്ച ടൈമറുകൾ റദ്ദാക്കാനും AbortSignal ഉപയോഗിക്കാം. ഇതിന് കുറച്ചുകൂടി മാനുവൽ പ്രവൃത്തി ആവശ്യമാണ്, കാരണം ബിൽറ്റ്-ഇൻ ടൈമർ ഫംഗ്ഷനുകൾ AbortSignal-നെ നേരിട്ട് പിന്തുണയ്ക്കുന്നില്ല. അബോർട്ട് സിഗ്നൽ ശ്രദ്ധിക്കുകയും അത് ട്രിഗർ ചെയ്യുമ്പോൾ ടൈമർ ക്ലിയർ ചെയ്യുകയും ചെയ്യുന്ന ഒരു കസ്റ്റം ഫംഗ്ഷൻ നിങ്ങൾ നിർമ്മിക്കേണ്ടതുണ്ട്.


function cancellableTimeout(callback, delay, signal) {
  let timeoutId;

  const timeoutPromise = new Promise((resolve, reject) => {
    timeoutId = setTimeout(() => {
      resolve(callback());
    }, delay);

    signal.addEventListener('abort', () => {
      clearTimeout(timeoutId);
      reject(new Error('Timeout Aborted'));
    });
  });

  return timeoutPromise;
}

const controller = new AbortController();
const signal = controller.signal;


cancellableTimeout(() => {
  console.log('Timeout executed');
}, 2000, signal)
.then(() => console.log("Timeout finished successfully"))
.catch(err => console.log(err));

// To cancel the timeout:
controller.abort();

വിശദീകരണം:

  1. cancellableTimeout ഫംഗ്ഷൻ ഒരു കോൾബാക്ക്, ഒരു ഡിലേ, ഒരു AbortSignal എന്നിവ ആർഗ്യുമെന്റുകളായി എടുക്കുന്നു.
  2. ഇതൊരു setTimeout സജ്ജീകരിക്കുകയും ടൈംഔട്ട് ഐഡി സംഭരിക്കുകയും ചെയ്യുന്നു.
  3. ഇത് abort ഇവന്റ് ശ്രദ്ധിക്കുന്ന ഒരു ഇവന്റ് ലിസണർ AbortSignal-ലേക്ക് ചേർക്കുന്നു.
  4. abort ഇവന്റ് ട്രിഗർ ചെയ്യുമ്പോൾ, ഇവന്റ് ലിസണർ ടൈംഔട്ട് ക്ലിയർ ചെയ്യുകയും പ്രോമിസ് നിരസിക്കുകയും ചെയ്യുന്നു.

ഇവന്റ് ലിസണറുകൾ റദ്ദാക്കുന്നു

ടൈമറുകൾക്ക് സമാനമായി, ഇവന്റ് ലിസണറുകൾ റദ്ദാക്കാൻ നിങ്ങൾക്ക് AbortSignal ഉപയോഗിക്കാം. അൺമൗണ്ട് ചെയ്യപ്പെടുന്ന ഒരു ഘടകവുമായി ബന്ധപ്പെട്ട ഇവന്റ് ലിസണറുകൾ നീക്കം ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുമ്പോൾ ഇത് പ്രത്യേകിച്ചും ഉപയോഗപ്രദമാണ്.


const controller = new AbortController();
const signal = controller.signal;

const button = document.getElementById('myButton');

button.addEventListener('click', () => {
  console.log('Button clicked!');
}, { signal });

// To cancel the event listener:
controller.abort();

വിശദീകരണം:

  1. നമ്മൾ signal-നെ addEventListener രീതിയിലേക്ക് ഒരു ഓപ്ഷനായി കൈമാറുന്നു.
  2. controller.abort() വിളിക്കുമ്പോൾ, ഇവന്റ് ലിസണർ യാന്ത്രികമായി നീക്കം ചെയ്യപ്പെടും.

റിയാക്റ്റ് ഘടകങ്ങളിൽ അബോർട്ട്കൺട്രോളർ

റിയാക്റ്റിൽ, ഒരു ഘടകം അൺമൗണ്ട് ചെയ്യുമ്പോൾ അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ റദ്ദാക്കാൻ നിങ്ങൾക്ക് AbortController ഉപയോഗിക്കാം. മെമ്മറി ലീക്കുകളും അൺമൗണ്ട് ചെയ്ത ഘടകങ്ങൾ അപ്‌ഡേറ്റ് ചെയ്യുന്നതിലൂടെ ഉണ്ടാകുന്ന പിശകുകളും തടയുന്നതിന് ഇത് അത്യന്താപേക്ഷിതമാണ്. useEffect ഹുക്ക് ഉപയോഗിക്കുന്ന ഒരു ഉദാഹരണം ഇതാ:


import React, { useState, useEffect } from 'react';

function MyComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data', { signal });
        if (!response.ok) {
          throw new Error(`HTTP error! Status: ${response.status}`);
        }
        const data = await response.json();
        setData(data);
      } catch (error) {
        if (error.name === 'AbortError') {
          console.log('Fetch aborted');
        } else {
          console.error('Fetch error:', error);
        }
      }
    }

    fetchData();

    return () => {
      controller.abort(); // Cancel the fetch request when the component unmounts
    };
  }, []); // Empty dependency array ensures this effect runs only once on mount

  return (
    
{data ? (

Data: {JSON.stringify(data)}

) : (

Loading...

)}
); } export default MyComponent;

വിശദീകരണം:

  1. നമ്മൾ useEffect ഹുക്കിനുള്ളിൽ ഒരു AbortController ഉണ്ടാക്കുന്നു.
  2. നമ്മൾ signal-നെ fetch അഭ്യർത്ഥനയിലേക്ക് കൈമാറുന്നു.
  3. നമ്മൾ useEffect ഹുക്കിൽ നിന്ന് ഒരു ക്ലീനപ്പ് ഫംഗ്ഷൻ നൽകുന്നു. ഘടകം അൺമൗണ്ട് ചെയ്യുമ്പോൾ ഈ ഫംഗ്ഷൻ വിളിക്കപ്പെടും.
  4. ക്ലീനപ്പ് ഫംഗ്ഷനുള്ളിൽ, ഫെച്ച് അഭ്യർത്ഥന റദ്ദാക്കാൻ നമ്മൾ controller.abort() വിളിക്കുന്നു.

വിപുലമായ ഉപയോഗ രീതികൾ

അബോർട്ട്സിഗ്നലുകൾ ശൃംഖലയാക്കുന്നു

ചിലപ്പോൾ, ഒന്നിലധികം AbortSignal-കൾ ഒരുമിച്ച് ശൃംഖലയാക്കാൻ നിങ്ങൾ ആഗ്രഹിച്ചേക്കാം. ഉദാഹരണത്തിന്, ഒരു പാരന്റ് ഘടകത്തിന് അതിന്റെ ചൈൽഡ് ഘടകങ്ങളിലെ പ്രവർത്തനങ്ങൾ റദ്ദാക്കേണ്ടി വന്നേക്കാം. ഒരു പുതിയ AbortController ഉണ്ടാക്കി അതിന്റെ സിഗ്നൽ പാരന്റ്, ചൈൽഡ് ഘടകങ്ങൾക്ക് കൈമാറുന്നതിലൂടെ നിങ്ങൾക്ക് ഇത് നേടാനാകും.

തേർഡ്-പാർട്ടി ലൈബ്രറികളോടൊപ്പം അബോർട്ട്കൺട്രോളർ ഉപയോഗിക്കുന്നു

നിങ്ങൾ AbortSignal-നെ നേരിട്ട് പിന്തുണയ്ക്കാത്ത ഒരു തേർഡ്-പാർട്ടി ലൈബ്രറി ഉപയോഗിക്കുകയാണെങ്കിൽ, ലൈബ്രറിയുടെ റദ്ദാക്കൽ സംവിധാനവുമായി പ്രവർത്തിക്കാൻ നിങ്ങളുടെ കോഡ് പൊരുത്തപ്പെടുത്തേണ്ടി വന്നേക്കാം. ഇതിനായി AbortSignal കൈകാര്യം ചെയ്യുന്ന നിങ്ങളുടെ സ്വന്തം ഫംഗ്ഷനുകളിൽ ലൈബ്രറിയുടെ അസിൻക്രണസ് ഫംഗ്ഷനുകൾ റാപ്പ് ചെയ്യേണ്ടി വരും.

അബോർട്ട്കൺട്രോളർ ഉപയോഗിക്കുന്നതിന്റെ പ്രയോജനങ്ങൾ

ബ്രൗസർ അനുയോജ്യത

ക്രോം, ഫയർഫോക്സ്, സഫാരി, എഡ്ജ് എന്നിവയുൾപ്പെടെയുള്ള ആധുനിക ബ്രൗസറുകളിൽ AbortController വ്യാപകമായി പിന്തുണയ്ക്കുന്നു. ഏറ്റവും പുതിയ വിവരങ്ങൾക്കായി നിങ്ങൾക്ക് MDN വെബ് ഡോക്സിലെ അനുയോജ്യതാ പട്ടിക പരിശോധിക്കാം.

പോളിഫില്ലുകൾ

AbortController-നെ പ്രാദേശികമായി പിന്തുണയ്ക്കാത്ത പഴയ ബ്രൗസറുകൾക്കായി, നിങ്ങൾക്ക് ഒരു പോളിഫിൽ ഉപയോഗിക്കാം. പഴയ ബ്രൗസറുകളിൽ പുതിയ ഫീച്ചറിന്റെ പ്രവർത്തനം നൽകുന്ന ഒരു കോഡാണ് പോളിഫിൽ. ഓൺലൈനിൽ നിരവധി AbortController പോളിഫില്ലുകൾ ലഭ്യമാണ്.

ഉപസംഹാരം

ജാവാസ്ക്രിപ്റ്റിലെ അസിൻക്രണസ് പ്രവർത്തനങ്ങൾ നിയന്ത്രിക്കുന്നതിനുള്ള ഒരു ശക്തമായ ഉപകരണമാണ് AbortController ഇൻ്റർഫേസ്. AbortController ഉപയോഗിക്കുന്നതിലൂടെ, റദ്ദാക്കൽ ഭംഗിയായി കൈകാര്യം ചെയ്യുന്ന വൃത്തിയുള്ളതും, കൂടുതൽ പ്രകടനക്ഷമതയുള്ളതും, കൂടുതൽ ശക്തവുമായ കോഡ് നിങ്ങൾക്ക് എഴുതാൻ കഴിയും. നിങ്ങൾ എപിഐകളിൽ നിന്ന് ഡാറ്റ ലഭ്യമാക്കുകയാണെങ്കിലും, ടൈമറുകൾ സജ്ജീകരിക്കുകയാണെങ്കിലും, അല്ലെങ്കിൽ ഇവന്റ് ലിസണറുകൾ നിയന്ത്രിക്കുകയാണെങ്കിലും, നിങ്ങളുടെ വെബ് ആപ്ലിക്കേഷനുകളുടെ മൊത്തത്തിലുള്ള ഗുണനിലവാരം മെച്ചപ്പെടുത്താൻ AbortController-ന് നിങ്ങളെ സഹായിക്കാനാകും.

കൂടുതൽ വായനയ്ക്ക്