我调用promise,它返回一个退订函数。如何使用useEffect
中的返回函数取消订阅?
useEffect(()=>{
let unSub = ()=>{}
async function run(){
unSub = await promise();
}
run();
return unSub
})
这样想,不知道这是不是正确的方式,做这件事的反应方式是什么?
我不认为针对你的具体情况有一个特定的知名做法。传统的React退订async
动作的方法是在useEffect
的主体中使用布尔值,并在清理时重置它。
如果您正在使用fetch
api,AbortController
api可以取消请求。如果你正在使用axios,有一个叫做cancelTokens
的东西可以取消请求。
也许这是一个解决方案:
useEffect(()=>{
let unSub = ()=>{};
let isMounted = true;
let newUnSubSet = false;
async function run(){
unSub = await promise();
newUnSubSet = true;
}
run();
return () => {
if (newUnSubSet) {
unSub();
}
newUnSubSet = false;
isMounted = false;
}
})
useEffect(()=>{
let unSub;
async function run(){
unSub = await promise();
}
run();
return ()=> unSub && unSub();
})
或基本的Pub/Sub模式:
useEffect(()=>{
let handlers= [];
async function run(){
unSub = await promise();
handlers.push(unSub);
}
run();
return ()=> handlers.forEach(handler=> handler());
})
// on component mount
useEffect(() => {
// do some stuff ie. subscribe
// on component unmount
return () => {
// do some stuff ie. unsubscribe
}
}, [/* dependencies */])