import * as cornerstone from 'cornerstone-core' const taskPool = [] // 请求池 let numRequest = 0 // 正在执行数量 const maxRequest = 10 // 可配置 let taskTimer // 轮询的定时器 const cachedTask = {} // 存放的任务数据 var currentAutoLoadTaskStauts = false // 预加载池的添加 function addTaskIntoPool(task) { return new Promise((resolve, reject) => { taskPool.forEach(task=>{ task.priority = task.priority }) const cache = cachedTask[task.key] const callback = (executeRes) => { if (executeRes.success) { resolve(executeRes.res) } else { reject(executeRes.err) } } const priority = task.priority || 0; if (cache) { cache.priority = priority task.callback =callback } else { task.callback =callback cachedTask[task.key] = task taskPool.push(task) } }) } // 执行下载 function executeTask() { if (taskPool.length > 0) { const executeRequest = maxRequest - numRequest if (executeRequest > 0) { for (let i = 0; i < executeRequest; i++) { sortTaskPool() const task = taskPool.shift() if (!task) { return } numRequest++ task.execute().then((res) => { numRequest-- task.callback({ success: true, res }) executeTask() }, (err) => { numRequest-- task.callback({ success: true }) delete cachedTask[task.key] executeTask() }) } } } else { startTaskTimer() } } function sortTaskPool() { if (taskPool.length > 0) { taskPool.sort((a, b) => b.priority-a.priority ) } } // 轮询检查请求池中是否有请求需要执行 function startTaskTimer() { taskTimer = setInterval(() => { if (taskPool.length > 0) { stopTaskTimer() executeTask() }else{ if(currentAutoLoadTaskStauts) return // 判断当前任务是否有序列未下载完成 var visitTaskList = sessionStorage.getItem('visitTaskList') if(visitTaskList){ visitTaskList = JSON.parse(visitTaskList) var idx = visitTaskList.findIndex(i => i.IsCurrentTask) var studyList = visitTaskList[idx].StudyList var series = getUnloadedSeries(studyList) if(series){ var priority = Date.parse(new Date()) series.imageIds.map(imageId => { loadAndCacheImagePlus(imageId,series.seriesId,priority) }) } } } }, 500) } function getUnloadedSeries(studyList){ var series = null for(var i = 0;i{ var sliceThickness = isNaN(parseInt(s.sliceThickness)) ? null : parseInt(s.sliceThickness) return (sliceThickness === 5 || s.instanceCount < 100) && !s.loadStatus }) if(idx > -1){ series = study.SeriesList[idx] break } } if(!series){ currentAutoLoadTaskStauts = true } return series } // 停止轮询 function stopTaskTimer() { clearInterval(taskTimer) taskTimer = null } function loadAndCacheImagePlus(imageId,seriesId, priority) { return new Promise((resolve, reject) => { // if(!taskTimer){ // startTaskTimer() // } 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 removeTask(seriesId){ stopTaskTimer() setTimeout(()=>{ 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() },500) } function buildImageRequestTask(imageId,seriesId, config = {}) { return { key: imageId, seriesId:seriesId, ...config, execute: () => { return cornerstone.loadAndCacheImage(imageId) } }; } export default { addTaskIntoPool, executeTask, startTaskTimer, stopTaskTimer, loadAndCacheImagePlus, removeTask }