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.
116 lines
3.3 KiB
116 lines
3.3 KiB
var global = require('../internals/global'); |
|
var apply = require('../internals/function-apply'); |
|
var bind = require('../internals/function-bind-context'); |
|
var isCallable = require('../internals/is-callable'); |
|
var hasOwn = require('../internals/has-own-property'); |
|
var fails = require('../internals/fails'); |
|
var html = require('../internals/html'); |
|
var arraySlice = require('../internals/array-slice'); |
|
var createElement = require('../internals/document-create-element'); |
|
var validateArgumentsLength = require('../internals/validate-arguments-length'); |
|
var IS_IOS = require('../internals/engine-is-ios'); |
|
var IS_NODE = require('../internals/engine-is-node'); |
|
|
|
var set = global.setImmediate; |
|
var clear = global.clearImmediate; |
|
var process = global.process; |
|
var Dispatch = global.Dispatch; |
|
var Function = global.Function; |
|
var MessageChannel = global.MessageChannel; |
|
var String = global.String; |
|
var counter = 0; |
|
var queue = {}; |
|
var ONREADYSTATECHANGE = 'onreadystatechange'; |
|
var location, defer, channel, port; |
|
|
|
try { |
|
// Deno throws a ReferenceError on `location` access without `--location` flag |
|
location = global.location; |
|
} catch (error) { /* empty */ } |
|
|
|
var run = function (id) { |
|
if (hasOwn(queue, 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(String(id), location.protocol + '//' + location.host); |
|
}; |
|
|
|
// Node.js 0.9+ & IE10+ has setImmediate, otherwise: |
|
if (!set || !clear) { |
|
set = function setImmediate(handler) { |
|
validateArgumentsLength(arguments.length, 1); |
|
var fn = isCallable(handler) ? handler : Function(handler); |
|
var args = arraySlice(arguments, 1); |
|
queue[++counter] = function () { |
|
apply(fn, undefined, args); |
|
}; |
|
defer(counter); |
|
return counter; |
|
}; |
|
clear = function clearImmediate(id) { |
|
delete queue[id]; |
|
}; |
|
// Node.js 0.8- |
|
if (IS_NODE) { |
|
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); |
|
// Browsers with postMessage, skip WebWorkers |
|
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object' |
|
} else if ( |
|
global.addEventListener && |
|
isCallable(global.postMessage) && |
|
!global.importScripts && |
|
location && location.protocol !== 'file:' && |
|
!fails(post) |
|
) { |
|
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 |
|
};
|
|
|