defer.js 734 B

123456789101112131415161718192021222324252627282930313233
  1. "use strict";
  2. var timeouts, messageName;
  3. // node.js
  4. if (typeof process === "object" && typeof process.nextTick === "function") {
  5. module.exports = process.nextTick;
  6. }
  7. // some browsers
  8. else if (typeof setImmediate === "function") {
  9. module.exports = setImmediate;
  10. }
  11. // most other browsers
  12. else {
  13. timeouts = [];
  14. messageName = "zero-timeout-message";
  15. window.addEventListener("message", handleMessage, true);
  16. module.exports = function (fn) {
  17. timeouts.push(fn);
  18. window.postMessage(messageName, "*");
  19. };
  20. }
  21. function handleMessage(event) {
  22. if (event.source == window && event.data == messageName) {
  23. event.stopPropagation();
  24. if (timeouts.length > 0) {
  25. var fn = timeouts.shift();
  26. fn();
  27. }
  28. }
  29. }