আপনি যখন কোন প্রতিশ্রুতি দেন তখন সমাধান হওয়ার কয়েক সেকেন্ড সময় লাগতে পারে এবং ততক্ষণে ব্যবহারকারী আপনার অ্যাপ্লিকেশনটিতে অন্য জায়গায় নেভিগেট করতে পারে। সুতরাং যখন প্রতিশ্রুতি সমাধানগুলি setStateআনমাউন্ট করা উপাদানগুলিতে কার্যকর করা হয় এবং আপনি একটি ত্রুটি পান - ঠিক তেমন আপনার ক্ষেত্রে। এটি মেমরি ফাঁস হতে পারে।
এজন্য আপনার কিছু অ্যাসিনক্রোনাস যুক্তিকে উপাদানগুলির বাইরে সরিয়ে নেওয়া ভাল।
অন্যথায়, আপনি একরকম প্রয়োজন হবে আপনার প্রতিশ্রুতি বাতিল । বিকল্পভাবে - একটি সর্বশেষ অবলম্বন কৌশল হিসাবে (এটি একটি অ্যান্টিপ্যাটার্ন) - উপাদানটি এখনও মাউন্ট করা আছে কিনা তা পরীক্ষা করতে আপনি একটি পরিবর্তনশীল রাখতে পারেন:
componentDidMount(){
this.mounted = true;
this.props.fetchData().then((response) => {
if(this.mounted) {
this.setState({ data: response })
}
})
}
componentWillUnmount(){
this.mounted = false;
}
আমি আবার জোর করব - এই এটি একটি প্রতিষেধক তবে এটি আপনার ক্ষেত্রে যথেষ্ট হতে পারে (ঠিক যেমন তারা Formikবাস্তবায়নের ক্ষেত্রেও করেছিল)।
গিটহাবের উপর একই রকম আলোচনা
সম্পাদনা:
হুক্সের সাথে আমি একই সমস্যাটি (প্রতিক্রিয়া ছাড়া কিছুই না থাকা) কীভাবে সমাধান করব :
বিকল্প একটি:
import React, { useState, useEffect } from "react";
export default function Page() {
const value = usePromise("https://something.com/api/");
return (
<p>{value ? value : "fetching data..."}</p>
);
}
function usePromise(url) {
const [value, setState] = useState(null);
useEffect(() => {
let isMounted = true;
request.get(url)
.then(result => {
if (isMounted) {
setState(result);
}
});
return () => {
isMounted = false;
};
}, []);
return value;
}
বিকল্প বি: বিকল্পভাবে useRefযা শ্রেণীর স্থির সম্পত্তি হিসাবে আচরণ করে যার অর্থ এটি পরিবর্তিত হয় যখন উপাদানটির মূল্য পরিবর্তন হয় তখন এটি উপাদান পুনরায় সরবরাহ করে না:
function usePromise2(url) {
const isMounted = React.useRef(true)
const [value, setState] = useState(null);
useEffect(() => {
return () => {
isMounted.current = false;
};
}, []);
useEffect(() => {
request.get(url)
.then(result => {
if (isMounted.current) {
setState(result);
}
});
}, []);
return value;
}
function useIsMounted() {
const isMounted = React.useRef(true)
useEffect(() => {
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
উদাহরণ: https://codesandbox.io/s/86n1wq2z8