You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					85 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					85 lines
				
				2.4 KiB
			| 
											3 years ago
										 | var ctx = require('./_ctx'); | ||
|  | var invoke = require('./_invoke'); | ||
|  | var html = require('./_html'); | ||
|  | var cel = require('./_dom-create'); | ||
|  | var global = require('./_global'); | ||
|  | var process = global.process; | ||
|  | var setTask = global.setImmediate; | ||
|  | var clearTask = global.clearImmediate; | ||
|  | var MessageChannel = global.MessageChannel; | ||
|  | var Dispatch = global.Dispatch; | ||
|  | var counter = 0; | ||
|  | var queue = {}; | ||
|  | var ONREADYSTATECHANGE = 'onreadystatechange'; | ||
|  | var defer, channel, port; | ||
|  | var run = function () { | ||
|  |   var id = +this; | ||
|  |   // eslint-disable-next-line no-prototype-builtins
 | ||
|  |   if (queue.hasOwnProperty(id)) { | ||
|  |     var fn = queue[id]; | ||
|  |     delete queue[id]; | ||
|  |     fn(); | ||
|  |   } | ||
|  | }; | ||
|  | var listener = function (event) { | ||
|  |   run.call(event.data); | ||
|  | }; | ||
|  | // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
 | ||
|  | if (!setTask || !clearTask) { | ||
|  |   setTask = function setImmediate(fn) { | ||
|  |     var args = []; | ||
|  |     var i = 1; | ||
|  |     while (arguments.length > i) args.push(arguments[i++]); | ||
|  |     queue[++counter] = function () { | ||
|  |       // eslint-disable-next-line no-new-func
 | ||
|  |       invoke(typeof fn == 'function' ? fn : Function(fn), args); | ||
|  |     }; | ||
|  |     defer(counter); | ||
|  |     return counter; | ||
|  |   }; | ||
|  |   clearTask = function clearImmediate(id) { | ||
|  |     delete queue[id]; | ||
|  |   }; | ||
|  |   // Node.js 0.8-
 | ||
|  |   if (require('./_cof')(process) == 'process') { | ||
|  |     defer = function (id) { | ||
|  |       process.nextTick(ctx(run, id, 1)); | ||
|  |     }; | ||
|  |   // Sphere (JS game engine) Dispatch API
 | ||
|  |   } else if (Dispatch && Dispatch.now) { | ||
|  |     defer = function (id) { | ||
|  |       Dispatch.now(ctx(run, id, 1)); | ||
|  |     }; | ||
|  |   // Browsers with MessageChannel, includes WebWorkers
 | ||
|  |   } else if (MessageChannel) { | ||
|  |     channel = new MessageChannel(); | ||
|  |     port = channel.port2; | ||
|  |     channel.port1.onmessage = listener; | ||
|  |     defer = ctx(port.postMessage, port, 1); | ||
|  |   // Browsers with postMessage, skip WebWorkers
 | ||
|  |   // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
 | ||
|  |   } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { | ||
|  |     defer = function (id) { | ||
|  |       global.postMessage(id + '', '*'); | ||
|  |     }; | ||
|  |     global.addEventListener('message', listener, false); | ||
|  |   // IE8-
 | ||
|  |   } else if (ONREADYSTATECHANGE in cel('script')) { | ||
|  |     defer = function (id) { | ||
|  |       html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { | ||
|  |         html.removeChild(this); | ||
|  |         run.call(id); | ||
|  |       }; | ||
|  |     }; | ||
|  |   // Rest old browsers
 | ||
|  |   } else { | ||
|  |     defer = function (id) { | ||
|  |       setTimeout(ctx(run, id, 1), 0); | ||
|  |     }; | ||
|  |   } | ||
|  | } | ||
|  | module.exports = { | ||
|  |   set: setTask, | ||
|  |   clear: clearTask | ||
|  | }; |