我有以下useEffect函数,正在尝试找到在组件卸载时清除它的最佳方法。
我认为最好遵循React docs中的makeCancelable
,但是当Promise被取消时,代码仍将执行。
const makeCancelable = (promise) => {
let hasCanceled_ = false;
const wrappedPromise = new Promise((resolve, reject) => {
promise.then(
val => hasCanceled_ ? reject({isCanceled: true}) : resolve(val),
error => hasCanceled_ ? reject({isCanceled: true}) : reject(error)
);
});
return {
promise: wrappedPromise,
cancel() {
hasCanceled_ = true;
},
};
};
//example useEffect
useEffect(() => {
const getData = async () => {
const collectionRef_1 = await firestore.collection(...)
const collectionRef_2 = await firestore.collection(...)
if (collectionRef_1.exists) {
//update local state
//this still runs!
}
if (collectionRef_2.exists) {
//update local state
//and do does this!
}
}
const getDataPromise = makeCancelable(new Promise(getData))
getDataPromise.promise.then(() => setDataLoaded(true))
return () => getDataPromise.cancel()
}, [dataLoaded, firestore])
我还尝试了
const getDataPromise = makeCancelable(getData)
,但没有成功。代码执行得很好,只是在组件卸载时不能正确清除。我是否需要取消这两个await函数?
makeCancelable(new Promise(getData))
我认为应该是makeCancelable(getData())
,注意这里是函数调用。 - Yury Tarabanko