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
						
					
					
				| 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
 | |
| };
 |