41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function Queue() {
 | ||
|   let waitingQueue = this.waitingQueue = [];
 | ||
|   let isRunning = this.isRunning = false; // 记录是否有未完成的任务
 | ||
| 
 | ||
|   function execute(task, resolve, reject) {
 | ||
|     task()
 | ||
|       .then((data) => {
 | ||
|         resolve(data);
 | ||
|       })
 | ||
|       .catch((e) => {
 | ||
|         reject(e);
 | ||
|       })
 | ||
|       .finally(() => {
 | ||
|         // 等待任务队列中如果有任务,则触发它;否则设置isRunning = false,表示无任务状态
 | ||
|         if (waitingQueue.length) {
 | ||
|           const next = waitingQueue.shift();
 | ||
|           execute(next.task, next.resolve, next.reject);
 | ||
|         } else {
 | ||
|           isRunning = false;
 | ||
|         }
 | ||
|       });
 | ||
|   }
 | ||
|   this.exec = function(task) {
 | ||
|     return new Promise((resolve, reject) => {
 | ||
|       if (isRunning) {
 | ||
|         waitingQueue.push({
 | ||
|           task,
 | ||
|           resolve,
 | ||
|           reject
 | ||
|         });
 | ||
|       } else {
 | ||
|         isRunning = true;
 | ||
|         execute(task, resolve, reject);
 | ||
|       }
 | ||
|     });
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| /* 队列实例,某些平台一起使用多个组件时需要通过队列逐一绘制,否则部分绘制方法异常,nvue端的iOS gcanvas尤其明显,在不通过队列绘制时会出现图片丢失的情况 */
 | ||
| export const queueDraw = new Queue();
 | ||
| export const queueLoadImage = new Queue(); |