当前位置:首页 > uni-app

uniapp队列下载

2026-03-04 23:27:31uni-app

uniapp 队列下载实现方法

在 uniapp 中实现队列下载功能,可以通过以下方法进行:

方法一:使用 Promise 和递归实现

创建一个下载队列数组,通过递归方式逐个下载文件。

let downloadQueue = []; // 存储下载任务
let currentDownload = null; // 当前下载任务

function addToQueue(url) {
    downloadQueue.push(url);
    if (!currentDownload) {
        startDownload();
    }
}

function startDownload() {
    if (downloadQueue.length === 0) {
        currentDownload = null;
        return;
    }

    const url = downloadQueue.shift();
    currentDownload = uni.downloadFile({
        url: url,
        success: (res) => {
            if (res.statusCode === 200) {
                console.log('下载成功:', res.tempFilePath);
            }
            startDownload();
        },
        fail: (err) => {
            console.error('下载失败:', err);
            startDownload();
        }
    });
}

方法二:使用 async/await 实现

利用 async/await 语法可以更清晰地控制下载流程。

const downloadQueue = [];
let isDownloading = false;

async function processQueue() {
    if (isDownloading || downloadQueue.length === 0) return;

    isDownloading = true;
    const url = downloadQueue.shift();

    try {
        const res = await uni.downloadFile({ url });
        if (res[0].statusCode === 200) {
            console.log('下载成功:', res[0].tempFilePath);
        }
    } catch (err) {
        console.error('下载失败:', err);
    } finally {
        isDownloading = false;
        processQueue();
    }
}

function addToQueue(url) {
    downloadQueue.push(url);
    processQueue();
}

方法三:限制并发数的队列下载

如果需要控制同时下载的数量,可以扩展方法二。

const MAX_CONCURRENT = 3; // 最大并发数
const downloadQueue = [];
let activeDownloads = 0;

async function downloadFile(url) {
    activeDownloads++;
    try {
        const res = await uni.downloadFile({ url });
        if (res[0].statusCode === 200) {
            console.log('下载成功:', res[0].tempFilePath);
        }
    } catch (err) {
        console.error('下载失败:', err);
    } finally {
        activeDownloads--;
        processQueue();
    }
}

function processQueue() {
    while (downloadQueue.length > 0 && activeDownloads < MAX_CONCURRENT) {
        const url = downloadQueue.shift();
        downloadFile(url);
    }
}

function addToQueue(url) {
    downloadQueue.push(url);
    processQueue();
}

注意事项

  1. 网络请求需要在 manifest.json 中配置合法域名
  2. 大量文件下载时注意内存管理
  3. 考虑添加失败重试机制
  4. 进度反馈可以通过 uni.onDownloadProgress 实现

扩展功能

可以进一步完善队列下载功能:

uniapp队列下载

// 添加任务优先级
function addToQueue(url, priority = false) {
    if (priority) {
        downloadQueue.unshift(url); // 插入队列头部
    } else {
        downloadQueue.push(url); // 插入队列尾部
    }
    processQueue();
}

// 添加下载进度监控
uni.onDownloadProgress((res) => {
    console.log('下载进度:', res.progress);
});

以上方法可以根据实际需求进行调整,实现适合项目的队列下载功能。

标签: 队列uniapp
分享给朋友:

相关文章

uniapp面试问啥

uniapp面试问啥

技术基础类问题 UniApp框架特性 跨端实现原理及条件编译的使用场景 如何理解"一次开发,多端运行"的优缺点 rpx与vw/vh单位的适配差异 Vue相关 生命周期在UniA…

uniapp实现懒加载

uniapp实现懒加载

uniapp实现懒加载的方法 在uniapp中实现懒加载可以通过多种方式,以下是几种常见的方法: 使用uni.lazyLoad组件 uniapp提供了内置的懒加载组件,适用于图片等资源的懒加载。在页…

uniapp中如何使用iconfont

uniapp中如何使用iconfont

使用 Iconfont 在 Uniapp 中的步骤 下载 Iconfont 资源 访问 Iconfont 官网,选择需要的图标并添加到项目。下载时选择 Font class 格式,解压后会得到 .tt…

精通uniapp

精通uniapp

掌握UniApp的基础知识 UniApp是一个基于Vue.js的跨平台开发框架,支持一次开发多端部署(如H5、小程序、App等)。核心概念包括Vue语法、组件化开发、条件编译(针对不同平台适配)以及U…

海康 uniapp

海康 uniapp

海康威视与UniApp集成方案 海康威视的硬件设备(如摄像头、NVR等)与UniApp结合,通常需要通过海康的开放平台API或SDK实现功能调用。以下是具体实现方法: 获取海康威视开放平台权限 注册…

uniapp 美颜

uniapp 美颜

uniapp 美颜实现方法 在uniapp中实现美颜功能可以通过多种方式完成,以下是一些常见的方法: 使用原生插件 uniapp支持调用原生插件实现美颜效果,适用于对性能要求较高的场景。需要开发原生…