irc_web/.svn/pristine/8a/8ae77a43e2bfec93022a4b9f9f0...

212 lines
5.5 KiB
Plaintext

import * as cornerstone from 'cornerstone-core'
const taskPool = [] // 请求池
let numRequest = 0 // 正在执行数量
const maxRequest = 6 // 可配置
let taskTimer // 轮询的定时器
var pendingList =[]
const cachedTask = {} // 存放的任务数据
const maxTask = 20
// 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) {
// console.log(numRequest)
numRequest = 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: false,err })
// delete cachedTask[task.key]
executeTask()
})
}
}
} else if(pendingList.length > 0) {
putPendingTaskIntoPool()
executeTask()
}else{
startTaskTimer()
}
}
function sortTaskPool() {
if (taskPool.length > 0) {
taskPool.sort((a, b) => b.priority-a.priority )
console.log(taskPool)
}
}
// 轮询检查请求池中是否有请求需要执行
function startTaskTimer() {
taskTimer = setInterval(() => {
if (taskPool.length > 0) {
stopTaskTimer()
executeTask()
}else{
return
// 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)
// })
// }
// }
}
}, 50)
}
// function getUnloadedSeries(studyList){
// var series = null
// for(var i = 0;i<studyList.length;i++){
// var study = studyList[i]
// var idx = study.SeriesList.findIndex(s=>{
// 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) => {
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()
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 setPendingList(arr){
pendingList = [...arr]
pendingList.sort((a, b) => b.priority-a.priority )
}
function putPendingTaskIntoPool(){
if(pendingList.length > 0){
var tasks = pendingList.slice(0,maxTask)
tasks.forEach(task=>{
loadAndCacheImagePlus(task.imageId,task.seriesId,task.priority)
var idx = pendingList.findIndex(i=>i.imageId===task.imageId)
if(idx > -1){
pendingList.splice(idx,1)
}
})
}
}
// function updateTaskPriority(seriesId,priority){
// if (taskPool.length > 0) {
// for(var i =0; i<taskPool.length;i++){
// if(taskPool[i] && taskPool[i].seriesId === seriesId){
// taskPool[i].priority = priority
// }else{
// break
// }
// }
// }
// executeTask()
// }
function buildImageRequestTask(imageId,seriesId, config = {}) {
return {
key: imageId,
seriesId:seriesId,
...config,
execute: () => {
return cornerstone.loadAndCacheImage(imageId)
}
};
}
export default {
addTaskIntoPool,
executeTask,
startTaskTimer,
stopTaskTimer,
loadAndCacheImagePlus,
removeTask,
setPendingList
}