【发布时间】:2021-10-27 01:24:52
【问题描述】:
我目前正在使用 axios 在 React Native 中开发搜索功能。
在实现搜索功能时,我使用 debounce from lodash 来限制发送的请求数量。
但是,由于请求响应的接收顺序不同,因此可能会显示错误的搜索结果。
例如,当用户在输入字段中输入“家居装饰”时,会有两个请求。
一个带有 'Home' 的请求,下一个带有 'Home deco' 作为搜索查询文本的请求。
如果带有 'Home' 的请求比第二个请求花费更多的时间返回,我们最终将显示 'Home' 查询文本而不是 'Home deco 的结果'
如果响应按顺序返回,但如果 'Home' 请求在 'Home deco' 请求之后返回,则两个结果都应按顺序显示给用户,那么 'Home' 响应应该被忽略。
以下是示例代码
function Search (){
const [results, setResults] = useState([]);
const [searchText, setSearchText] = useState('');
useEffect(() => {
getSearchResultsDebounce(searchText);
}, [searchText]);
const getSearchResultsDebounce = useCallback(
_.debounce(searchText => {
getSearchResults(searchText)
}, 1000),
[]
);
function getSearchResults(searchText) {
const urlWithParams = getUrlWithParams(url, searchText);
axios.get(urlWithParams, { headers: config.headers })
.then(response => {
if (response.status === 200 && response.data)
{
setResults(response.data);
} else{
//Handle error
}
})
.catch(error => {
//Handle error
});
}
return (
<View>
<SearchComponent onTextChange={setSearchText}/>
<SearchResults results={results}/>
</View>
)
}
解决上述问题的最佳方法是什么?
【问题讨论】:
-
在类似的情况下,我检查了查询文本,如果查询与结果匹配,则显示匹配的结果,否则仅缓存。
-
在以正确顺序返回响应的情况下,它会阻止我们在我的示例中显示“Home”的结果?
-
你能展示你的实现吗?实现这一目标的方法有很多。
-
承诺链 - 可选地与请求取消结合
-
不幸的是,我真的不擅长
react...但是,一般来说,我会这样做是有两个变量...sequence和displayedSequence...发出请求时,您有一个关联的mySequence = ++sequence...收到响应时,您检查mySequence是否小于displayedSequence- 如果是,则setresults并将displayedSequence设置为@987654330 @ - 对不起,我不能为你写代码,正如我所说,我的react很弱
标签: javascript ajax react-native axios