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();
							 |