我有以下反应本机代码:
.env
此代码用于实时搜索。每当用户输入新字母时,都应取消先前的GET请求。问题在于,键入时,所有请求都会被取消,即使是最后一个请求也会被取消,因此最后没有请求完成。
我在想(但是我不确定)是因为setCancelToken是异步的(它不是立即完成的,但是会有一点延迟)。
当我省去cancelToken东西时,它可以工作,可以看到结果,所以我的服务器端代码还可以。
我尝试了不同的方法:
const [cancelToken, setCancelToken] = useState()
const searchUsersHandler = () => {
if (cancelToken) {
cancelToken.cancel()
}
setCancelToken(axios.CancelToken.source())
try {
let response = await axios.get(`/users/${searchQuery}`, {
headers: {
'Accept': 'application/json'
},
cancelToken: cancelToken.token
})
setUsers(response.data)
} catch (error) {
if (axios.isCancel(error)) {
console.log('cancelled searching for', searchQuery)
}
}
}
我试图将useState挂钩cancelToken更改为let,以使其同步。但是在这段代码中,让cancelToken保持未定义状态。
我认为这是因为每次输入字母时,整个代码都会重新呈现,因此let cancelToken设置为undefined。这是正确的吗?如果是这样,我该如何预防呢?
我还尝试向代码中添加超时,但是结果与第一个代码相同。
我的问题是:现在,所有请求被取消,甚至最后一个请求也被取消。如何重新制作此代码,以便最后一个请求不会被取消?