schedule.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. var util = require("./util");
  3. var schedule;
  4. var noAsyncScheduler = function() {
  5. throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
  6. };
  7. if (util.isNode && typeof MutationObserver === "undefined") {
  8. var GlobalSetImmediate = global.setImmediate;
  9. var ProcessNextTick = process.nextTick;
  10. schedule = util.isRecentNode
  11. ? function(fn) { GlobalSetImmediate.call(global, fn); }
  12. : function(fn) { ProcessNextTick.call(process, fn); };
  13. } else if ((typeof MutationObserver !== "undefined") &&
  14. !(typeof window !== "undefined" &&
  15. window.navigator &&
  16. window.navigator.standalone)) {
  17. schedule = (function() {
  18. var div = document.createElement("div");
  19. var opts = {attributes: true};
  20. var toggleScheduled = false;
  21. var div2 = document.createElement("div");
  22. var o2 = new MutationObserver(function() {
  23. div.classList.toggle("foo");
  24. toggleScheduled = false;
  25. });
  26. o2.observe(div2, opts);
  27. var scheduleToggle = function() {
  28. if (toggleScheduled) return;
  29. toggleScheduled = true;
  30. div2.classList.toggle("foo");
  31. };
  32. return function schedule(fn) {
  33. var o = new MutationObserver(function() {
  34. o.disconnect();
  35. fn();
  36. });
  37. o.observe(div, opts);
  38. scheduleToggle();
  39. };
  40. })();
  41. } else if (typeof setImmediate !== "undefined") {
  42. schedule = function (fn) {
  43. setImmediate(fn);
  44. };
  45. } else if (typeof setTimeout !== "undefined") {
  46. schedule = function (fn) {
  47. setTimeout(fn, 0);
  48. };
  49. } else {
  50. schedule = noAsyncScheduler;
  51. }
  52. module.exports = schedule;