let loadQueue = [] let pendingRequests = new Map() const batchSize = 8 const debug = false function load() { while(loadQueue.length>0 && pendingRequests.size { pendingRequests.delete(url) let buffer = xhr.response postMessage({ success: true, url, col, row, buffer}, [buffer]) } xhr.onerror = (event) => { pendingRequests.delete(url) let buffer = null postMessage({ success: false, url, col, row, buffer}) } xhr.open('GET', url, true) xhr.send() pendingRequests.set(url, xhr) } if (loadQueue.length>0) setTimeout(load, 1000/120) else { if (debug) console.log('Ready') } } self.onmessage = (event) => { let msg = event.data switch(msg.command) { case 'load': for(let tile of msg.tiles) { loadQueue.push(tile) } load() break case 'abort': loadQueue = [] for(let xhr of pendingRequests.values()) { xhr.abort() } if (debug) console.log('Abort') break default: console.warn('Unknown worker command: ' + msg.command) } }