## 分批请求函数

- 入参方式
  - 1. （页码 + 页面大小）
  - 2. （偏移量 + 页面大小）

### 1》页码 + 页面大小

```
const fetchCameras = async () => {
    try {
        const token = localStorage.getItem('alertToken');
        const limit = 20; // 每次请求 20 条数据
        let offset = 0; // 从 0 开始
        let allCameras = [];

        // 第一次请求，用于获取总数
        const firstResponse = await apiInstance.getCameras(limit, offset, token);
        cameraCount.value = firstResponse.count;
        allCameras = firstResponse.results;

        // 根据总数继续请求剩余的数据
        const total = cameraCount.value;
        while (offset + limit < total) {
            offset += limit;
            const response = await apiInstance.getCameras(limit, offset, token);
            allCameras = allCameras.concat(response.results);
        }
        cameras.value = allCameras;
    } catch (error) {
        console.error('Error fetching cameras:', error);
    }
};
```



### 2》 偏移量 + 页面大小

- .length

```
const fetchEvents = async () => {
  try {
    const token = localStorage.getItem('alertToken');
    const limit = 2;
    let currentPage = 1;
    let allEvents = [];
    let total = 0;

    // 先请求一次以获取总条数
    const firstResponse = await apiInstance.getEvents(token, limit, currentPage);
    total = firstResponse.totalItems; // 总条数
    allEvents = firstResponse.tableData; // 第一次请求的数据

    // 使用 while 循环来请求后续的数据
    while (allEvents.length < total) {
      currentPage += 1;
      const offset = (currentPage - 1) * limit;
      const response = await apiInstance.getEvents(token, limit, currentPage);
      
      allEvents = allEvents.concat(response.tableData); // 追加数据
    }

    tableData.value = allEvents; // 将所有数据赋值给 tableData
  } catch (error) {
    console.error("Error fetching events data:", error);
  }
};
```



- offset + limit计算(初稿备份)

```
const fetchEvents = async () => {
  try {
    const token = localStorage.getItem('alertToken');
    const limit = 2000;
    let currentPage = 1;
    let allEvents = [];
    let total = 0;
    let offset = (currentPage - 1) * limit;

    // 先请求一次以获取总条数
    const firstResponse = await apiInstance.getEvents(token, limit, currentPage);
    total = firstResponse.totalItems; // 总条数
    allEvents = firstResponse.tableData; // 第一次请求的数据

    // 使用 while 循环来请求后续的数据
    while (offset+limit < total) {
      currentPage += 1;
      offset = (currentPage - 1) * limit;
      const response = await apiInstance.getEvents(token, limit, currentPage);
      
      allEvents = allEvents.concat(response.tableData); // 追加数据
    }

    tableData.value = allEvents; // 将所有数据赋值给 tableData
  } catch (error) {
    console.error("Error fetching events data:", error);
  }
};
```



## 数组并行处理和排序

- 更改前（分两个数组直接存）

```
const fetchCameras = async () => {
  try {
    // 获取摄像头数据
    const token = localStorage.getItem('alertToken');
    const limit = 20;
    let offset = 0;
    let allCameras = [];

    // 获取所有摄像头信息
    const firstResponse = await apiInstance.getCameras(limit, offset, token);
    const cameraCount = firstResponse.count;
    allCameras = firstResponse.results;

    while (offset + limit < cameraCount) {
      offset += limit;
      const response = await apiInstance.getCameras(limit, offset, token);
      allCameras = allCameras.concat(response.results);
    }

    // 提取摄像头名称和对应的告警数量
    const cameraNames = [];
    const cameraCounts = [];

    for (const camera of allCameras) {
      cameraNames.push(camera.name);

      // 获取该摄像头的告警数量
      const eventsResponse = await apiInstance.getEventsByParams(token, 20, 1, null, null, null, camera.id);
      const count = eventsResponse.count || 0; // 确保即使没有事件也返回 0
      cameraCounts.push(count);
    }

    // 更新图表的 Y 轴标签和系列数据
    option.value.yAxis[0].data = cameraNames;
    option.value.yAxis[1].data = cameraCounts.map(count => `${count}`);
    option.value.series[0].data = cameraCounts;
    option.value.series[1].data = cameraCounts;

    // 设置图表选项并启动轮播
    myChart.setOption(option.value);
    startMoveDataZoom(); // 重新启动轮播效果
  } catch (error) {
    console.error("Error fetching cameras or events:", error);
  }
};

```



- 更改后

```
const fetchCameras = async () => {
  try {
    // 获取摄像头数据
    const token = localStorage.getItem('alertToken');
    const limit = 20;
    let offset = 0;
    let allCameras = [];

    // 获取所有摄像头信息
    const firstResponse = await apiInstance.getCameras(limit, offset, token);
    const cameraCount = firstResponse.count;
    allCameras = firstResponse.results;

    while (offset + limit < cameraCount) {
      offset += limit;
      const response = await apiInstance.getCameras(limit, offset, token);
      allCameras = allCameras.concat(response.results);
    }

    // 提取摄像头名称和对应的告警数量并存储在对象数组中
    const cameraData = [];

    for (const camera of allCameras) {
      // 获取该摄像头的告警数量
      const eventsResponse = await apiInstance.getEventsByParams(token, 20, 1, null, null, null, camera.id);
      const count = eventsResponse.count || 0; // 确保即使没有事件也返回 0
      cameraData.push({ name: camera.name, count }); // 将数据存储为对象以便排序
    }

    // 按照告警数量降序排序
    cameraData.sort((a, b) => b.count - a.count);

    // 提取排序后的名称和数量
    const cameraNames = cameraData.map(item => item.name);
    const cameraCounts = cameraData.map(item => item.count);

    // 更新图表的 Y 轴标签和系列数据
    option.value.yAxis[0].data = cameraNames;
    option.value.yAxis[1].data = cameraCounts.map(count => `${count}`);
    option.value.series[0].data = cameraCounts;
    option.value.series[1].data = cameraCounts;

    // 设置图表选项并启动轮播
    myChart.setOption(option.value);
    startMoveDataZoom(); // 重新启动轮播效果
  } catch (error) {
    console.error("Error fetching cameras or events:", error);
  }
};

```



