152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
| import * as cornerstone from 'cornerstone-core'
 | |
| var taskPool = [] // 请求池
 | |
| let numRequest = 0 // 正在执行数量
 | |
| const maxRequest = 6 // 可配置
 | |
| let taskTimer // 轮询的定时器
 | |
| var cachedTask = {} // 存放的任务数据
 | |
| 
 | |
| // 执行下载
 | |
| async function executeTask() {
 | |
|   if (taskPool.length > 0) {
 | |
|     sortTaskPool()
 | |
|     var taskPromises = []
 | |
|       for (let i = 0; i < maxRequest; i++) {
 | |
|         const task = taskPool.shift()
 | |
|         if (!task) return
 | |
|         taskPromises.push((task.execute))
 | |
|       }
 | |
|     await Promise.all(taskPromises.map(task=>task()));
 | |
|     executeTask()
 | |
|     // await new Promise(resolve => setTimeout(resolve, delay));
 | |
| 
 | |
|     // 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){
 | |
|   //   clearInterval(taskTimer)
 | |
|   //   taskTimer = null
 | |
|   // }
 | |
|   // taskTimer = setInterval(() => {
 | |
|   //   if (taskPool.length > 0) {
 | |
|   //     stopTaskTimer()
 | |
|   //     executeTask()
 | |
|   //   }else{
 | |
|   //     return
 | |
|   //   }
 | |
|   // }, 50)
 | |
|   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)
 | |
|       // })
 | |
|       taskPool.push(imageTask)
 | |
|     }
 | |
|   })
 | |
| }
 | |
| // 预加载池的添加
 | |
| function addTaskIntoPool(task) {
 | |
|   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
 | |
| }
 |