@livelybone/request-idle-callback
Version:
A polyfill for `window.requestIdleCallback`, support NodeJs. It can be used for time slicing
10 lines (8 loc) • 2.01 kB
JavaScript
/**
* Bundle of @livelybone/request-idle-callback
* Generated: 2020-05-11
* Version: 1.1.0
* License: MIT
* Author: 2631541504@qq.com
*/
!function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){"use strict";var i={hidden:!1};var n="undefined"==typeof window?global||{}:window,a={times:1,duration:1e3/30,update:function(n){var e=Math.max(1e3/120,Math.min(1e3/30,n));this.times+=1,this.duration=(this.duration+e)/2},correct:function(){var o,d=0;return new Promise(function(i){!function t(){"function"==typeof n.requestAnimationFrame&&n.requestAnimationFrame(function(n){var e=n||(new Date).getTime();o&&a.update(e-o),o=e,++d<15?t():i(a.duration)})}()})}};a.correct(),a.duration=1e3/60;var e,o=function(){return(new Date).getTime()},d=o();function c(){return Math.max(0,a.duration-(o()-d))}function u(n){return{didTimeout:n,timeRemaining:function(){return 50*c()/a.duration}}}function r(t){cancelAnimationFrame(e);function n(){setTimeout(function(){for(var n=0;c()&&n<t.length;n+=1){var e=t[n];if(!e.canceled&&!e.done){try{e.callback(u(!1))}catch(n){setTimeout(function(){throw n},0)}e.done=!0}}t.splice(0,n),d=o(),t.length&&r(t)})}i.hidden?n():e=requestAnimationFrame(n)}var f=0;var l=[];!function(n){if("undefined"!=typeof document){var e="hidden"in document?"hidden":"webkitHidden"in document?"webkitHidden":"mozHidden"in document?"mozHidden":null;if(e){var t=e.replace(/hidden/i,"visibilitychange");window.addEventListener(t,function(){i.hidden=document[e],n(i.hidden)})}}}(function(n){n&&r(l)});var t="undefined"==typeof window?global||{}:window;t.requestIdleCallback&&t.cancelIdleCallback||(t.requestIdleCallback=function(n,e){var t,i=(t=n,{id:++f,canceled:!1,done:!1,callback:function(n){try{t(n)}catch(n){setTimeout(function(){throw n},0)}}});return l.push(i),e&&e.timeout&&+e.timeout&&setTimeout(function(){i.done||(i.callback(u(!0)),i.done=!0)},+e.timeout),r(l),i.id},t.cancelIdleCallback=function(n){for(var e=0;e<l.length;e+=1)if(l[e].id===n){l[e].canceled=!0;break}})});