Skip to content

如何用一个接口优雅的实现2个List的翻页加载

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

首先抛出我的问题?

如何用一个接口实现2个list的翻页加载,需求如下图所示,当list1数据全部加载完毕之后再返回list2的数据。(不限制list1和list2的数据个数,有多少条都要通过翻页加载取出来)

image.png

思路

  1. 关键问题是如何定义翻页,什么场景下开始返回list2的数据
  2. 翻页加载标配字段pageCount,来定义每页加载数量
  3. track定义翻页规则,用|分割,|前面是偏移量,|后面标记本次返回哪个list的数据
  4. 将list1和list2对应的返回场景定义为常量,方便区分

核心代码

sql
const TYPE_LIST1 = 1;
const TYPE_LIST2 = 2;
public static function demoList($userid, $pageCount = 10, $track = '', $select = '*')     {         $offsetTrack = 0;
$typeTrack = 1;
$more = 1;
$list1 = [];
$list2 = [];
if (!empty($track)) {             $decodeTrack = explode("|", $track);
$offsetTrack = intval($decodeTrack[0]);
$typeTrack = intval($decodeTrack[1]);
}         //取list1 或者 list1+list2         if ($typeTrack == self::TYPE_LIST1) {             $list1 = self::getList1($userid, $offsetTrack, $pageCount);
//list1返回的个数比pageCount小 说明数据不足 需要在请求list2的数据             $list1Count = count($list1);
if ($list1Count < $pageCount) {                 $typeTrack = self::TYPE_LIST2;
$offsetTrack = $list1Count;
} else {                 $track = $offsetTrack + $list1Count . "|" . self::TYPE_LIST1;
$more = 1;
}         }         //只取list2         if ($typeTrack == self::TYPE_LIST2) {             $offset = $offsetTrack;
$list2 = self::getList2($userid, $pageCount, $offset);
$more = count($list2) < $pageCount ? 0 : 1;
$track = $offset + count($list2) . "|" . self::TYPE_LIST2;
}         $ret = [             'track' => $track,             'more' => $more,             'list1' => $list1,             'list2' => $list2,         ];
return $ret;
}

进阶思路

  1. 上面代码简化了getList1(),getList()2,目的是直观的解答抛出的问题
  2. 实际项目中getList()方法内部有缓存数据处理,有考虑数据实时性的问题

进阶问题

  1. 比如需求变更为list2中的数据有一个状态,如果状态改变需要从list2列表中移动到list1列表中怎么处理?

思考

  1. 进阶问题考察的关键是状态改变,这个状态改变是实时变化的吗?实时变化的话,只有主动推送状态变化给客户端通知更新。
  2. 我们便引入了消息推送机制,保证数据结构体的一致性,当list2中的数据状态改变,就推送这条数据到客户端,又客户端添加到list1中

进阶思考

  1. 这样又引出了一个问题,list2中的数据如何移除,移除之后怎么保证再次翻页查找不会重复取数据,不会丢数据?

AI 应用开发训练营 · 现在开始

别只收藏 AI 文章,今天就做出第一个能上线的项目

文章解决认知,项目才证明能力。把 Agent、RAG、MCP 变成可运行、可展示、可面试表达的成果,现在就从一次岗位准备度自测开始。

立即开始 AI 岗位准备度自测 查看训练营路线
真实学员成果先看成果,再决定是否开始 →
  1. 01选方向
  2. 02做项目
  3. 03出成果
  4. 04拿面试