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.
84 lines
2.4 KiB
84 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 |
|
};
|
|
|