[英]How to handle request and avoid code duplication?
我想要做的是避免代码重复管理来自已发出的请求的响应并将输出提供给整个 useState 的组件。
在这种情况下,一旦页面加载完毕, useEffect 就会被触发。 它使用 setLoadedPlaces 将数据设置为 searchedPlace 并使用 setMarker 将数据设置为 markerMap 来发出请求并处理响应。
如果用户发出新请求,数据的处理方式与 useEffect 函数相同,唯一的区别是请求是通过 POST 附加主体发出的。
我认为只提出一个请求就足够了,但是如何呢?
这两个函数都发生了很多事情,我试图推断结果但返回了一个承诺,它必须用.then(() => {})
因为它是异步的,但是如何呢?
const [searchedPlaces, setLoadedPlaces] = useState();
const [MarkersMap, setMarkersMap] = useState();
使用效果()
useEffect(() => {
const fetchPlaces = async () => {
try {
const responseData = await sendRequest(
"http://localhost:5000/api/search"
);
//here I assign the data to setsetLoadedPlaces
setLoadedPlaces(responseData.elements);
//here I extrapolate lng and lat and assign to setMarkersMap
let locations = [];
responseData.elements.map(element => {
element.location.lat = parseFloat(element.location.lat);
element.location.lng = parseFloat(element.location.lng);
locations.push(element.location);
return locations;
});
setMarkersMap(locations);
} catch (err) {}
};
fetchPlaces();
}, [sendRequest]);
由按钮触发的 receivedInputs()
const receivedInputs = async val => {
console.log(val.address);
try {
let responseData = await fetch("http://localhost:5000/api/search?", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
address: val.address.value.toLowerCase(),
price: val.price.value.toLowerCase(),
leaseTime: val.leaseTime.value.toLowerCase()
})
});
let fetchPlaces = await responseData.json();
//here I assign the data to setsetLoadedPlaces
setLoadedPlaces(fetchPlaces.elements);
//here I extrapolate lng and lat and assign to setMarkersMap
let locations = [];
fetchPlaces.elements.map(element => {
element.location.lat = parseFloat(element.location.lat);
element.location.lng = parseFloat(element.location.lng);
locations.push(element.location);
return locations;
});
setMarkersMap(locations);
} catch (err) {
console.log(err);
}
};
看起来你应该把这部分提升到它自己的功能中:
const handleResponseData = responseData => {
setLoadedPlaces(responseData.elements);
const locations = responseData.elements.map(element => {
element.location.lat = parseFloat(element.location.lat);
element.location.lng = parseFloat(element.location.lng);
return element;
});
setMarkersMap(locations);
}
然后只需调用它:
useEffect(() => {
const fetchPlaces = async () => {
try {
const responseData = await sendRequest(
"http://localhost:5000/api/search"
);
handleResponseData(responseData)
} catch (err) {}
};
fetchPlaces();
}, [sendRequest]);
const SearchSubmitHandler = async event => {
event.preventDefault();
try {
let responseData = await fetch("http://localhost:5000/api/search?", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
address: formState.inputs.address.value.toLowerCase(),
price: formState.inputs.price.value.toLowerCase(),
leaseTime: formState.inputs.leaseTime.value.toLowerCase()
})
});
handleResponseData(responseData.json())
} catch (err) {
console.log(err);
}
};
创建一个函数,在 useEffect 钩子和回调中获取和调用该函数。
const Component = () => {
const fetch = aynsc () => { //... }
useEffect(() => { fetch() }, [])
searchSubmitHandler = () => { fetch() }
return {}
}
好的,我以这种方式管理了解决方案,我考虑了Will Jenkins 的回答并添加了 then() 方法,因为它返回了一个 Promise。 如果请求成功,其中带有“响应”作为参数。
// *** useEffect ***
useEffect(() => {
const fetchPlaces = async () => {
try {
const responseData = await sendRequest(
"http://localhost:5000/api/search"
);
return responseData;
} catch (err) {}
};
fetchPlaces().then(response => {
handleResponseData(response);
});
}, [sendRequest]);
// *** Request ***
const receivedInputs = async val => {
try {
let responseData = await fetch("http://localhost:5000/api/search?", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
address: val.address.value.toLowerCase(),
price: val.price.value.toLowerCase(),
leaseTime: val.leaseTime.value.toLowerCase()
})
});
return responseData.json().then(response => {
handleResponseData(response);
});
} catch (err) {
console.log(err);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.