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