121 lines
2.9 KiB
JavaScript
121 lines
2.9 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _raf = require('raf');
|
|
|
|
var _raf2 = _interopRequireDefault(_raf);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
var MODE_TIMEOUT = 0;
|
|
var MODE_INTERVAL = 1;
|
|
var fnStacks = new Map();
|
|
var runArray = new Set();
|
|
var rafStarted = false;
|
|
var startId = 0;
|
|
|
|
function getTimeStamp() {
|
|
return new Date().getTime();
|
|
}
|
|
|
|
function executeFn(value) {
|
|
var fn = value.fn,
|
|
args = value.args;
|
|
|
|
fn.apply(undefined, _toConsumableArray(args));
|
|
}
|
|
|
|
function runFunction() {
|
|
if (runArray.size === 0) return;
|
|
runArray.forEach(executeFn);
|
|
runArray.clear();
|
|
}
|
|
|
|
var checkTick = function checkTick(currentTimeTick) {
|
|
return function (value, id) {
|
|
var nextTick = value.nextTick,
|
|
ms = value.ms,
|
|
mode = value.mode;
|
|
|
|
if (currentTimeTick - nextTick >= 0) {
|
|
runArray.add(value);
|
|
if (mode === MODE_TIMEOUT) {
|
|
fnStacks.delete(id);
|
|
} else {
|
|
fnStacks.set(id, Object.assign({}, value, {
|
|
nextTick: nextTick + ms
|
|
}));
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
function loop() {
|
|
var currentTimeTick = getTimeStamp();
|
|
fnStacks.forEach(checkTick(currentTimeTick));
|
|
runFunction();
|
|
if (fnStacks.size === 0) {
|
|
rafStarted = false;
|
|
return;
|
|
}
|
|
(0, _raf2.default)(loop);
|
|
}
|
|
|
|
function addId(_ref) {
|
|
var fn = _ref.fn,
|
|
_ref$ms = _ref.ms,
|
|
ms = _ref$ms === undefined ? 0 : _ref$ms,
|
|
args = _ref.args,
|
|
mode = _ref.mode;
|
|
|
|
if (!fn) return null;
|
|
var currentId = startId;
|
|
fnStacks.set(currentId, {
|
|
fn: fn,
|
|
ms: ms,
|
|
nextTick: getTimeStamp() + ms,
|
|
args: args,
|
|
mode: mode
|
|
});
|
|
if (!rafStarted) {
|
|
rafStarted = true;
|
|
(0, _raf2.default)(loop);
|
|
}
|
|
startId += 1;
|
|
return currentId;
|
|
}
|
|
|
|
function removeId(id) {
|
|
if (fnStacks.has(id)) {
|
|
fnStacks.delete(id);
|
|
}
|
|
if (fnStacks.size === 0) {
|
|
rafStarted = false;
|
|
}
|
|
}
|
|
|
|
exports.default = {
|
|
setTimeout: function setTimeout(fn) {
|
|
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
args[_key - 2] = arguments[_key];
|
|
}
|
|
|
|
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
return addId({ fn: fn, ms: ms, args: args, mode: MODE_TIMEOUT });
|
|
},
|
|
clearTimeout: removeId,
|
|
setInterval: function setInterval(fn) {
|
|
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
|
args[_key2 - 2] = arguments[_key2];
|
|
}
|
|
|
|
var ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
return addId({ fn: fn, ms: ms, args: args, mode: MODE_INTERVAL });
|
|
},
|
|
clearInterval: removeId
|
|
}; |