184 lines
4.7 KiB
Plaintext
184 lines
4.7 KiB
Plaintext
import * as cornerstone from 'cornerstone-core'
|
|
var taskPool = [] // 请求池
|
|
let numRequest = 0 // 正在执行数量
|
|
const maxRequest = 6 // 可配置
|
|
let taskTimer // 轮询的定时器
|
|
var cachedTask = {} // 存放的任务数据
|
|
|
|
// 执行下载
|
|
async function executeTask() {
|
|
// stopTaskTimer()
|
|
if (taskPool.length > 0) {
|
|
|
|
sortTaskPool()
|
|
var requestNum = Math.min(taskPool.length, maxRequest)
|
|
const tasks = taskPool.splice(0, requestNum);
|
|
|
|
const taskPromises = tasks.map((task) => {
|
|
return task.execute().then((result) => {
|
|
task.callback({ success: true, res: result })
|
|
|
|
}).catch((error) => {
|
|
task.callback({ success: true, err: error })
|
|
})
|
|
})
|
|
await Promise.all(taskPromises)
|
|
// results.forEach((result, index) => {
|
|
// const task = tasks[index];
|
|
// if (task.callback) {
|
|
// task.callback(result);
|
|
// }
|
|
// });
|
|
// for (let i = 0; i < requestNum; i++) {
|
|
// const task = taskPool.shift()
|
|
// if (!task) continue
|
|
// tasks.push(task)
|
|
// }
|
|
// // taskPromises.map(task=>task())
|
|
// await Promise.all(tasks.map(task=>task.execute())).then(res=>{
|
|
// res.map(v=>{
|
|
// var i = tasks.findIndex(task=>task.key ===v.imageId )
|
|
// if(i>-1){
|
|
// tasks[i].callback({ success: true, res: v })
|
|
// }
|
|
// })
|
|
// })
|
|
executeTask()
|
|
|
|
// const taskPromises = [];
|
|
// const delay = 50
|
|
// for(let i = 0;i< taskPool.length; i++ ){
|
|
// taskPromises.push(()=>cornerstone.loadAndCacheImage(taskPool[i].key))
|
|
// }
|
|
// for (let i = 0; i < taskPromises.length; i += maxRequest) {
|
|
// const tasks = taskPromises.slice(i, i + maxRequest);
|
|
// await Promise.all(tasks.map(task=>task()));
|
|
// await new Promise(resolve => setTimeout(resolve, delay));
|
|
// }
|
|
|
|
|
|
// while (taskPool.length > 0) {
|
|
|
|
// var requestNum = taskPool.length > maxRequest ? maxRequest : taskPool.length
|
|
// for (let i = 0; i < requestNum; i++) {
|
|
// sortTaskPool()
|
|
// const task = taskPool.shift()
|
|
// if (!task) return
|
|
// batchPromises.push(cornerstone.loadAndCacheImage(task.key))
|
|
// }
|
|
// await Promise.all(batchPromises);
|
|
// }
|
|
}else{
|
|
startTaskTimer()
|
|
}
|
|
|
|
}
|
|
|
|
function sortTaskPool() {
|
|
if (taskPool.length > 0) {
|
|
taskPool.sort((a, b) => b.priority-a.priority )
|
|
|
|
}
|
|
}
|
|
|
|
// 轮询检查请求池中是否有请求需要执行
|
|
function startTaskTimer() {
|
|
if (taskTimer) return; // 如果已存在定时器,则不重复启动
|
|
|
|
taskTimer = setInterval(() => {
|
|
if (taskPool.length > 0) {
|
|
stopTaskTimer();
|
|
executeTask();
|
|
}
|
|
}, 50);
|
|
}
|
|
|
|
// 停止轮询
|
|
function stopTaskTimer() {
|
|
clearInterval(taskTimer)
|
|
taskTimer = null
|
|
}
|
|
function loadAndCacheImagePlus(imageId,seriesId, priority) {
|
|
return new Promise((resolve, reject) => {
|
|
const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId)
|
|
if (imageLoadObject) {
|
|
imageLoadObject.promise.then((image) => {
|
|
resolve(image)
|
|
}, (err) => {
|
|
reject(err)
|
|
})
|
|
} else {
|
|
const imageTask = buildImageRequestTask(imageId,seriesId, { priority })
|
|
addTaskIntoPool(imageTask).then((res) => {
|
|
resolve(res)
|
|
}).catch(e => {
|
|
reject(e)
|
|
})
|
|
}
|
|
})
|
|
}
|
|
// 预加载池的添加
|
|
// function addTaskIntoPool(task) {
|
|
// taskPool.push(task)
|
|
// sortTaskPool()
|
|
// }
|
|
// 预加载池的添加
|
|
function addTaskIntoPool(task) {
|
|
return new Promise((resolve, reject) => {
|
|
const callback = (executeRes) => {
|
|
if (executeRes.success) {
|
|
resolve(executeRes.res)
|
|
} else {
|
|
reject(executeRes.err)
|
|
}
|
|
}
|
|
task.callback =callback
|
|
taskPool.push(task)
|
|
})
|
|
}
|
|
function removeTask(seriesId){
|
|
stopTaskTimer()
|
|
if (taskPool.length > 0) {
|
|
for(var i =taskPool.length-1; i>=0;i--){
|
|
if(taskPool[i] && taskPool[i].seriesId === seriesId){
|
|
delete cachedTask[taskPool[i].key]
|
|
taskPool.splice(i,1)
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
startTaskTimer()
|
|
}
|
|
function resetRequestPool(){
|
|
taskPool = []
|
|
pendingList =[]
|
|
cachedTask = {}
|
|
}
|
|
function resetCachedTask(){
|
|
taskPool = []
|
|
pendingList =[]
|
|
cachedTask = {}
|
|
}
|
|
function buildImageRequestTask(imageId,seriesId, config = {}) {
|
|
return {
|
|
key: imageId,
|
|
seriesId:seriesId,
|
|
...config,
|
|
execute: () => {
|
|
return cornerstone.loadAndCacheImage(imageId)
|
|
}
|
|
};
|
|
}
|
|
|
|
export default {
|
|
addTaskIntoPool,
|
|
executeTask,
|
|
startTaskTimer,
|
|
stopTaskTimer,
|
|
loadAndCacheImagePlus,
|
|
removeTask,
|
|
resetRequestPool,
|
|
resetCachedTask
|
|
}
|