场景:比如移动端上的一个页面,上面是一个搜索框,下面是一个结果列表。列表底部根据是否加载到最后一页,显示不同的文案。
代码:
/** 搜索框值 */
const [searchVal, setSearchVal] = useState("");
/** 是否最后一页 */
const [last, setLast] = useState(false);
/** 页码 */
const query = useRef({ page: 0, size: 20 });
// 先重置再请求接口
useEffect(() => {
// last重置后,列表view底部文案会随之切换
setLast(false);
useRef.current.page = 0;
getData();
}, [searchVal]);
const getData = async () => {
if (last) {
return;
const params = {
searchVal
const data = await getDataByAjax(params, query);
/* 省略列表赋值相关逻辑 */
if (data.last) {
setLast(true)
这样写其实有问题的,因为setLast是异步更新的,执行getData的时候,last还是true。
所已当遇到这种需求时,现在虽然只是等待一个useState和一个useRef更新完成后再请求接口,如果有多个useState和useRef需要重置后再请求接口,该怎么解决呢?其实就是有没有类似Promise.all()那种方案,不管前置需要几个异步操作,等待所有的异步操作完成后再执行某个操作。
大佬们求教