← Back to React Course | Chapter 10: Data Fetching & Async | Lesson 1 of 10

fetch() से Data लाना

React में fetch() उपयोग करना एक messenger भेजने जैसा है जो दूसरी building से information लाए और उसे आपके page पर दिखाने के लिए वापस लाए।
Syntax
markup
useEffect(() => {
  fetch("https://api.example.com/data")
    .then(response => {
      if (!response.ok) throw new Error("Request failed");
      return response.json();
    })
    .then(data => setData(data));
}, []);

एक Basic fetch() Request बनाना

fetch(url) एक HTTP request भेजता है और एक Promise return करता है जो headers आने पर एक Response object में resolve होता है। उस response पर .json() call करना (जो खुद एक और Promise return करता है) response body parse करता है, आपको actual data देते हुए।

Note: इस two-step process के सबसे clear, readable version के लिए useEffect के अंदर async/await उपयोग करें।
Warning: fetch() का Promise 404 या 500 response पर भी resolve होता है — यह सिर्फ इसलिए reject नहीं होता कि server ने एक error status return किया।

उदाहरण: Making a Basic fetch() Request

markup
<!DOCTYPE html>
<html>
<head>
  <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>
  <script type="text/babel">
function App() {
  const [data, setData] = React.useState(null);
  React.useEffect(() => {
    setData({ message: "Simulated fetch result" });
  }, []);
  return <p>{data ? data.message : "Loading..."}</p>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
  </script>
</body>
</html>

HTTP Errors के लिए response.ok Check करना

चूंकि fetch() HTTP error statuses पर reject नहीं होता, response.ok check करना (200-299 statuses के लिए true) एक failed request detect करने और इसे explicitly handle करने का standard तरीका है, आमतौर पर अलग से catch होने के लिए एक error throw करके।

Note: response.status exact numeric status code देता है अगर आपको specific errors पर branch करना हो (जैसे 401 vs 404)।
Warning: यह check skip करना मतलब एक 404 response silently successful माना जाता है, potentially broken या missing data को valid जैसे render करते हुए।

उदाहरण: Checking response.ok for HTTP Errors

markup
<!DOCTYPE html>
<html>
<head>
  <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>
  <script type="text/babel">
function App() {
  const [error, setError] = React.useState(null);
  React.useEffect(() => {
    const ok = false;
    if (!ok) setError("Request failed with status 404");
  }, []);
  return <p style={{color: "red"}}>{error || "Success"}</p>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
  </script>
</body>
</html>

Render Body में नहीं, useEffect के Inside Fetch करना

एक component के body में directly fetch() call करना (useEffect के बाहर) इसे हर single render पर चलाता है, उस re-render को भी शामिल करते हुए जो खुद fetch के कारण होता है, एक infinite request loop बनाते हुए।

इसे एक empty dependency array के साथ useEffect में wrap करना इसे initial render के बाद exactly एक बार चलाता है।

Note: एक empty dependency array ([]) का मतलब है 'इस effect को सिर्फ एक बार चलाओ, first render के बाद' — एक one-time data fetch के लिए standard pattern।
Warning: fetch के result से setState call करना बिना fetch को useEffect में wrap किए React को endlessly re-render और re-fetch कराता है।

उदाहरण: Fetching Inside useEffect, Not the Render Body

markup
<!DOCTYPE html>
<html>
<head>
  <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>
  <script type="text/babel">
function App() {
  const [data, setData] = React.useState(null);
  React.useEffect(() => {
    // fetch("/api/data").then(r => r.json()).then(setData);
    setData("Loaded once, safely, via useEffect");
  }, []);
  return <p>{data || "Loading..."}</p>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
  </script>
</body>
</html>
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. यह भूल जाना कि fetch() सिर्फ network failure पर reject होता है, 404/500 जैसे HTTP error statuses पर नहीं — आपको खुद response.ok check करना होगा।
  2. Response body actually parse करने के लिए .json() (या कोई और body-reading method) call न करना।
  3. fetch() को component body में directly चलाना useEffect के अंदर चलाने के बजाय, requests का एक infinite loop बनाते हुए।
चैप्टर सारांश
  • fetch() HTTP requests बनाने के लिए built-in browser API है, जो एक Promise return करता है।
  • fetch() सिर्फ network errors पर reject होता है — HTTP error statuses पकड़ने के लिए response.ok check करना ज़रूरी है।
  • response.json() (जो खुद भी एक Promise है) response body को JSON के रूप में parse करता है।
  • एक component में data fetching render body में नहीं, useEffect के अंदर होना चाहिए।
ब्राउज़र सपोर्ट

fetch() सभी modern browsers में supported है (बिना polyfill के IE11 में नहीं); किसी भी React version के साथ काम करता है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.