Kodokon kodokon.com

एक API को कॉल करना: fetch, लोडिंग, और त्रुटियाँ

किसी इफ़ेक्ट के भीतर fetch से दूरस्थ डेटा लोड करें, लोडिंग और त्रुटि की स्थितियों को साफ़-सुथरे ढंग से मॉडल करें।

10 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक नेटवर्क अनुरोध समय लेता है और विफल हो सकता है: आपके इंटरफ़ेस को उन वास्तविकताओं को दर्शाना चाहिए। पेशेवर परंपरा है तीन अलग state के टुकड़ों को ट्रैक करना: प्राप्त डेटा, एक लोडिंग बूलियन, और एक संभावित त्रुटि। अनुरोध एक useEffect के भीतर जाता है, क्योंकि किसी सर्वर से संपर्क करना एक साइड इफ़ेक्ट है।

JSX
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);

useEffect(() => {
  fetch("https://api.example.com/users")
    .then((res) => {
      if (!res.ok) throw new Error("HTTP " + res.status);
      return res.json();
    })
    .then((data) => setUsers(data))
    .catch((err) => setError(err.message))
    .finally(() => setLoading(false));
}, []);
एक अनुरोध के लिए तीन state: डेटा, लोडिंग, त्रुटि।

render में, मामलों को क्रम में संभालें: पहले लोडिंग, फिर त्रुटि, और अंत में डेटा। ये अर्ली रिटर्न कोड को पठनीय रखते हैं और गारंटी देते हैं कि उपयोगकर्ता हमेशा कुछ सुसंगत देखे: एक प्रतीक्षा संकेतक, एक विफलता संदेश, या अपेक्षित सूची।

JSX
if (loading) return <p>Loading…</p>;
if (error) return <p>Error: {error}</p>;

return (
  <ul>
    {users.map((user) => (
      <li key={user.id}>{user.name}</li>
    ))}
  </ul>
);
अर्ली रिटर्न: एक बार में केवल एक मामला प्रदर्शित।

एक आख़िरी जाल: यदि कोई डिपेंडेंसी बदलती है (उदाहरण के लिए एक userId), तो एक नया अनुरोध बाहर जाता है जबकि पुराना अभी भी प्रवाह में हो सकता है। यदि पुराना आख़िर में जवाब देता है, तो यह ताज़ा डेटा को अधिलेखित कर देगा। शास्त्रीय उपाय: क्लीनअप फ़ंक्शन द्वारा true पर सेट किया गया एक ignore फ़्लैग, बासी प्रतिक्रियाओं को फेंकने के लिए।

JSX
useEffect(() => {
  let ignore = false;
  setLoading(true);

  fetch("/api/users/" + userId)
    .then((res) => res.json())
    .then((data) => {
      if (!ignore) setUser(data);
    })
    .finally(() => {
      if (!ignore) setLoading(false);
    });

  return () => {
    ignore = true;
  };
}, [userId]);
फ़्लैग की बदौलत हर बासी प्रतिक्रिया को छोड़ दिया जाता है।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. एक अनुरोध के लिए तीन state (डेटा, लोडिंग, त्रुटि) क्यों ट्रैक करें?
    • क्योंकि काम करने के लिए fetch को इन तीन वेरिएबल की ज़रूरत है
    • ताकि इंटरफ़ेस हर चरण को दर्शाए: प्रतीक्षा, विफलता, या सफलता
    • React को हर render पर अनुरोध दोबारा फ़ायर करने से रोकने के लिए
  2. आपका API 500 स्थिति के साथ जवाब देता है, पर catch कभी फ़ायर नहीं होता। क्यों?
    • fetch केवल एक नेटवर्क विफलता पर प्रॉमिस अस्वीकार करता है, HTTP त्रुटि स्थिति के लिए नहीं
    • catch किसी useEffect के भीतर काम नहीं करता
    • catch को ट्रिगर करने के लिए सर्वर को एक विशेष हेडर भेजना चाहिए
  3. इफ़ेक्ट के क्लीनअप में true पर सेट किया गया ignore फ़्लैग किसलिए उपयोग होता है?
    • सर्वर की ओर से प्रवाह में चल रहे HTTP अनुरोध को रद्द करने के लिए
    • React को इफ़ेक्ट दोबारा चलाने से रोकने के लिए
    • एक ऐसे अनुरोध की प्रतिक्रिया को छोड़ने के लिए जो बासी हो चुकी है