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