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.
		
		
		
		
		
			
		
			
				
					
					
						
							107 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
	
	
							107 lines
						
					
					
						
							2.9 KiB
						
					
					
				var global = require('../internals/global'); | 
						|
var fails = require('../internals/fails'); | 
						|
var classof = require('../internals/classof-raw'); | 
						|
var bind = require('../internals/function-bind-context'); | 
						|
var html = require('../internals/html'); | 
						|
var createElement = require('../internals/document-create-element'); | 
						|
var IS_IOS = require('../internals/engine-is-ios'); | 
						|
 | 
						|
var location = global.location; | 
						|
var set = global.setImmediate; | 
						|
var clear = global.clearImmediate; | 
						|
var process = global.process; | 
						|
var MessageChannel = global.MessageChannel; | 
						|
var Dispatch = global.Dispatch; | 
						|
var counter = 0; | 
						|
var queue = {}; | 
						|
var ONREADYSTATECHANGE = 'onreadystatechange'; | 
						|
var defer, channel, port; | 
						|
 | 
						|
var run = function (id) { | 
						|
  // eslint-disable-next-line no-prototype-builtins | 
						|
  if (queue.hasOwnProperty(id)) { | 
						|
    var fn = queue[id]; | 
						|
    delete queue[id]; | 
						|
    fn(); | 
						|
  } | 
						|
}; | 
						|
 | 
						|
var runner = function (id) { | 
						|
  return function () { | 
						|
    run(id); | 
						|
  }; | 
						|
}; | 
						|
 | 
						|
var listener = function (event) { | 
						|
  run(event.data); | 
						|
}; | 
						|
 | 
						|
var post = function (id) { | 
						|
  // old engines have not location.origin | 
						|
  global.postMessage(id + '', location.protocol + '//' + location.host); | 
						|
}; | 
						|
 | 
						|
// Node.js 0.9+ & IE10+ has setImmediate, otherwise: | 
						|
if (!set || !clear) { | 
						|
  set = 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 | 
						|
      (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); | 
						|
    }; | 
						|
    defer(counter); | 
						|
    return counter; | 
						|
  }; | 
						|
  clear = function clearImmediate(id) { | 
						|
    delete queue[id]; | 
						|
  }; | 
						|
  // Node.js 0.8- | 
						|
  if (classof(process) == 'process') { | 
						|
    defer = function (id) { | 
						|
      process.nextTick(runner(id)); | 
						|
    }; | 
						|
  // Sphere (JS game engine) Dispatch API | 
						|
  } else if (Dispatch && Dispatch.now) { | 
						|
    defer = function (id) { | 
						|
      Dispatch.now(runner(id)); | 
						|
    }; | 
						|
  // Browsers with MessageChannel, includes WebWorkers | 
						|
  // except iOS - https://github.com/zloirock/core-js/issues/624 | 
						|
  } else if (MessageChannel && !IS_IOS) { | 
						|
    channel = new MessageChannel(); | 
						|
    port = channel.port2; | 
						|
    channel.port1.onmessage = listener; | 
						|
    defer = bind(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 && | 
						|
    !fails(post) && | 
						|
    location.protocol !== 'file:' | 
						|
  ) { | 
						|
    defer = post; | 
						|
    global.addEventListener('message', listener, false); | 
						|
  // IE8- | 
						|
  } else if (ONREADYSTATECHANGE in createElement('script')) { | 
						|
    defer = function (id) { | 
						|
      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { | 
						|
        html.removeChild(this); | 
						|
        run(id); | 
						|
      }; | 
						|
    }; | 
						|
  // Rest old browsers | 
						|
  } else { | 
						|
    defer = function (id) { | 
						|
      setTimeout(runner(id), 0); | 
						|
    }; | 
						|
  } | 
						|
} | 
						|
 | 
						|
module.exports = { | 
						|
  set: set, | 
						|
  clear: clear | 
						|
};
 | 
						|
 |