কীভাবে পর্যায়ক্রমে পটভূমিতে ডেটা সিঙ্ক্রোনাইজ করবেন

সিসিলিয়া কং
Cecilia Cong

আধুনিক উপায়

পর্যায়ক্রমিক পটভূমি সিঙ্ক যখন একটি প্রগতিশীল ওয়েব অ্যাপ বা পরিষেবা কর্মী-সমর্থিত পৃষ্ঠা চালু হয় তখন আপনাকে নতুন সামগ্রী দেখাতে দেয়। এটি ব্যাকগ্রাউন্ডে ডেটা ডাউনলোড করে এটি করে যখন অ্যাপ বা পৃষ্ঠা ব্যবহার করা হচ্ছে না।

পর্যায়ক্রমিক পটভূমি সিঙ্ক API ব্যবহার করে

পরিষেবা কর্মী ইনস্টল হওয়ার পরে, periodic-background-sync জন্য অনুসন্ধান করতে অনুমতি API ব্যবহার করুন। আপনি এটি একটি উইন্ডো বা একটি পরিষেবা কর্মী প্রসঙ্গ থেকে করতে পারেন।

const status = await navigator.permissions.query({
  name: 'periodic-background-sync',
});
if (status.state === 'granted') {
  // Periodic background sync can be used.
} else {
  // Periodic background sync cannot be used.
}

একটি পর্যায়ক্রমিক সিঙ্ক নিবন্ধন করার জন্য একটি ট্যাগ এবং একটি সর্বনিম্ন সিঙ্ক্রোনাইজেশন ব্যবধান উভয়ই প্রয়োজন ( minInterval )৷ ট্যাগ নিবন্ধিত সিঙ্ক সনাক্ত করে যাতে একাধিক সিঙ্ক নিবন্ধিত হতে পারে। নীচের উদাহরণে, ট্যাগের নাম হল 'content-sync' এবং minInterval হল একদিন।

navigator.serviceWorker.ready.then(async registration => {
  try {
    await registration.periodicSync.register('get-cats', { minInterval: 24 * 60 * 60 * 1000 });
    console.log(Periodic background sync registered.');
  } catch (err) {
    console.error(err.name, err.message);
  }
});

রেজিস্ট্রেশন ট্যাগগুলির একটি অ্যারে পুনরুদ্ধার করতে periodicSync.getTags() এ কল করুন। নীচের উদাহরণটি আবার আপডেট এড়াতে ক্যাশে আপডেট সক্রিয় আছে তা নিশ্চিত করতে ট্যাগ নাম ব্যবহার করে।

const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {
  const tags = await registration.periodicSync.getTags();
  // Only update content if sync isn't set up.
  if (!tags.includes('content-sync')) {
    updateContentOnPageLoad();
  }
} else {
  // If periodic background sync isn't supported, always update.
  updateContentOnPageLoad();
}

একটি পর্যায়ক্রমিক ব্যাকগ্রাউন্ড সিঙ্ক ইভেন্টে প্রতিক্রিয়া জানাতে আপনার পরিষেবা কর্মীর সাথে একটি periodicsync ইভেন্ট হ্যান্ডলার যোগ করুন। ইভেন্ট অবজেক্টটিতে পাস করা একটি ট্যাগ প্যারামিটার থাকবে যা রেজিস্ট্রেশনের সময় ব্যবহৃত মানের সাথে মেলে। উদাহরণস্বরূপ, যদি একটি পর্যায়ক্রমিক ব্যাকগ্রাউন্ড সিঙ্ক 'content-sync' নামের সাথে নিবন্ধিত হয়, তাহলে event.tag হবে 'content-sync'

self.addEventListener('periodicsync', (event) => {
  if (event.tag === 'content-sync') {
    event.waitUntil(syncContent());
  }
});

ব্রাউজার সামঞ্জস্য

ব্রাউজার সমর্থন

  • 80
  • 80
  • এক্স
  • এক্স

উৎস

ক্লাসিক উপায়

ব্যাকগ্রাউন্ডে ডেটা আপডেট করার পরিবর্তে ব্যবহারকারী যখন অ্যাপটি লোড করে তখন এটি প্রস্তুত থাকে, ক্লাসিক উপায়ে কেবল লোড হওয়া ডেটা আপডেট করা হয়।

আরও পড়া

ডেমো

এইচটিএমএল

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="icon"
      href=""
    />
    <link rel="manifest" href="./manifest.json" />
    <title>How to periodically synchronize data in the background</title>
    <link rel="stylesheet" href="/style.css" />
    <!-- TODO: Devsite - Removed inline handlers -->
    <!-- <script src="/script.js" defer></script> -->
  </head>
  <body>
    <h1>How to periodically synchronize data in the background</h1>
    <p class="available">Periodic background sync can be used. Install the app first.</p>
    <p class="not-available">Periodic background sync cannot be used.</p>
    <h2>Last updated</h2>
    <p class="last-updated">Never</p>
    <h2>Registered tags</h2>
    <ul>
      <li>None yet.</li>
    </ul>
  </body>
</html>

সিএসএস


        html {
  box-sizing: border-box;
  font-family: system-ui, sans-serif;
  color-scheme: dark light;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  margin: 1rem;
}
        

জেএস


        const available = document.querySelector('.available');
const notAvailable = document.querySelector('.not-available');
const ul = document.querySelector('ul');
const lastUpdated = document.querySelector('.last-updated');

const updateContent = async () => {
  const data = await fetch(
    'https://worldtimeapi.org/api/timezone/Europe/London.json'
  ).then((response) => response.json());
  return new Date(data.unixtime * 1000);
};

const registerPeriodicBackgroundSync = async (registration) => {
  const status = await navigator.permissions.query({
    name: 'periodic-background-sync',
  });
  if (status.state === 'granted' && 'periodicSync' in registration) {
    try {
      // Register the periodic background sync.
      await registration.periodicSync.register('content-sync', {
        // An interval of one day.
        minInterval: 24 * 60 * 60 * 1000,
      });
      available.hidden = false;
      notAvailable.hidden = true;

      // List registered periodic background sync tags.
      const tags = await registration.periodicSync.getTags();
      if (tags.length) {
        ul.innerHTML = '';
      }
      tags.forEach((tag) => {
        const li = document.createElement('li');
        li.textContent = tag;
        ul.append(li);
      });

      // Update the user interface with the last periodic background sync data.
      const backgroundSyncCache = await caches.open('periodic-background-sync');
      if (backgroundSyncCache) {
        const backgroundSyncResponse =
          backgroundSyncCache.match('/last-updated');
        if (backgroundSyncResponse) {
          lastUpdated.textContent = `${await fetch('/last-updated').then(
            (response) => response.text()
          )} (periodic background-sync)`;
        }
      }

      // Listen for incoming periodic background sync messages.
      navigator.serviceWorker.addEventListener('message', async (event) => {
        if (event.data.tag === 'content-sync') {
          lastUpdated.textContent = `${await updateContent()} (periodic background sync)`;
        }
      });
    } catch (err) {
      console.error(err.name, err.message);
      available.hidden = true;
      notAvailable.hidden = false;
      lastUpdated.textContent = 'Never';
    }
  } else {
    available.hidden = true;
    notAvailable.hidden = false;
    lastUpdated.textContent = `${await updateContent()} (manual)`;
  }
};

if ('serviceWorker' in navigator) {
  window.addEventListener('load', async () => {
    const registration = await navigator.serviceWorker.register('./sw.js');
    console.log('Service worker registered for scope', registration.scope);

    await registerPeriodicBackgroundSync(registration);
  });
}