You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.2 KiB
41 lines
1.2 KiB
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(); |