防抖指南 中的所有核心概念同样适用于异步防抖。
通常情况下,你可以直接使用普通的同步防抖器,它也能与异步函数一起工作。但是,对于一些高级用例,例如希望使用防抖函数的返回值(而不仅仅是调用 setState 副作用),或者将错误处理逻辑放在防抖器中,你可以使用异步防抖器。
TanStack Pacer 通过 AsyncDebouncer 类和 asyncDebounce 函数提供异步防抖功能。
以下是一个基本示例,展示了如何将异步防抖器用于搜索操作:
const debouncedSearch = asyncDebounce(
async (searchTerm: string) => {
const results = await fetchSearchResults(searchTerm)
return results
},
{
wait: 500,
onSuccess: (results, debouncer) => {
console.log('搜索成功:', results)
},
onError: (error, debouncer) => {
console.error('搜索失败:', error)
}
}
)
// 用法
try {
const results = await debouncedSearch('query')
// 处理成功的结果
} catch (error) {
// 如果未提供 onError 处理程序,则处理错误
console.error('搜索失败:', error)
}
const debouncedSearch = asyncDebounce(
async (searchTerm: string) => {
const results = await fetchSearchResults(searchTerm)
return results
},
{
wait: 500,
onSuccess: (results, debouncer) => {
console.log('搜索成功:', results)
},
onError: (error, debouncer) => {
console.error('搜索失败:', error)
}
}
)
// 用法
try {
const results = await debouncedSearch('query')
// 处理成功的结果
} catch (error) {
// 如果未提供 onError 处理程序,则处理错误
console.error('搜索失败:', error)
}
与返回 void 的同步防抖器不同,异步版本允许你捕获和使用防抖函数的返回值。maybeExecute 方法返回一个 Promise,该 Promise 会解析为函数的返回值,从而允许你等待结果并适当地处理它。
异步防抖器提供了强大的错误处理功能:
AsyncDebouncer 支持以下回调:
示例:
const asyncDebouncer = new AsyncDebouncer(async (value) => {
await saveToAPI(value)
}, {
wait: 500,
onSuccess: (result, debouncer) => {
// 每次成功执行后调用
console.log('异步函数已执行', debouncer.getSuccessCount())
},
onSettled: (debouncer) => {
// 每次执行尝试后调用
console.log('异步函数已完成', debouncer.getSettledCount())
},
onError: (error) => {
// 如果异步函数抛出错误,则调用
console.error('异步函数失败:', error)
}
})
const asyncDebouncer = new AsyncDebouncer(async (value) => {
await saveToAPI(value)
}, {
wait: 500,
onSuccess: (result, debouncer) => {
// 每次成功执行后调用
console.log('异步函数已执行', debouncer.getSuccessCount())
},
onSettled: (debouncer) => {
// 每次执行尝试后调用
console.log('异步函数已完成', debouncer.getSettledCount())
},
onError: (error) => {
// 如果异步函数抛出错误,则调用
console.error('异步函数失败:', error)
}
})
由于防抖器的 maybeExecute 方法返回一个 Promise,因此你可以选择在开始下一次执行之前等待每次执行。这使你可以控制执行顺序,并确保每个调用都处理最新的数据。当处理依赖于先前调用结果的操作或维护数据一致性至关重要时,这尤其有用。
例如,如果你正在更新用户的个人资料,然后立即获取其更新的数据,则可以在开始获取之前等待更新操作。
与同步防抖器一样,异步防抖器支持 wait 和 enabled 的动态选项,这些选项可以是接收防抖器实例的函数。这允许实现复杂的、运行时自适应的防抖行为。
每个框架适配器都提供了一些钩子,这些钩子构建在核心异步防抖功能之上,以与框架的状态管理系统集成。每个框架都有诸如 createAsyncDebouncer、useAsyncDebouncedCallback 或类似的可用钩子。
有关核心防抖概念和同步防抖,请参阅防抖指南。