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