download.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {
  2. ImgCache
  3. } from './imgCache.js';
  4. /**
  5. * 图片下载任务队列
  6. */
  7. class DownLoadQueue {
  8. constructor() {
  9. // 初始化任务队列
  10. this.taskList = [];
  11. }
  12. /**
  13. * 添加图片下载任务
  14. * @param {Object} task 图片下载任务
  15. */
  16. add(task) {
  17. task.isDownload = false;
  18. this.taskList.push(task);
  19. this.consume();
  20. }
  21. /**
  22. * 任务消费方法
  23. */
  24. async consume() {
  25. if (this.taskList.length <= 0) {
  26. return;
  27. }
  28. // 从下载队列中获取第 1 条数据
  29. const task = this.taskList[0];
  30. // 判断是否正在下载
  31. if (task.isDownload) {
  32. return;
  33. }
  34. // 状态修改为正在下载
  35. task.isDownload = true;
  36. // 判断是否已经下载过该图片
  37. if (await ImgCache.isExistFile(task.filePath)) {
  38. // 已经存在,无需重复下载, 进行下一个任务下载
  39. this.taskList.shift();
  40. return this.consume();
  41. }
  42. // 创建文件下载任务
  43. // #ifdef MP-WEIXIN
  44. uni.downloadFile({
  45. url: task.url,
  46. success: (res) => {
  47. if (res.statusCode === 200) {
  48. // 下载成功,保存文件
  49. uni.getFileSystemManager().saveFile({
  50. tempFilePath: res.tempFilePath,
  51. filePath: task.filePath
  52. });
  53. }
  54. },
  55. complete: () => {
  56. // 进行下一个任务下载
  57. this.taskList.shift();
  58. this.consume();
  59. }
  60. })
  61. // #endif
  62. // #ifdef APP-PLUS
  63. const downloadTask = plus.downloader.createDownload(task.url, {
  64. filename: task.filePath
  65. }, (download, status) => {
  66. // 进行下一个任务下载
  67. this.taskList.shift();
  68. this.consume();
  69. })
  70. // 开始执行下载任务
  71. downloadTask.start()
  72. // #endif
  73. }
  74. }
  75. // 创建图片缓存下载队列
  76. let downLoadQueue = new DownLoadQueue();
  77. export default downLoadQueue;