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.
		
		
		
		
		
			
		
			
				
					
					
						
							70 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							70 lines
						
					
					
						
							1.9 KiB
						
					
					
				var global = require('./_global');
 | 
						|
var macrotask = require('./_task').set;
 | 
						|
var Observer = global.MutationObserver || global.WebKitMutationObserver;
 | 
						|
var process = global.process;
 | 
						|
var Promise = global.Promise;
 | 
						|
var isNode = require('./_cof')(process) == 'process';
 | 
						|
 | 
						|
module.exports = function () {
 | 
						|
  var head, last, notify;
 | 
						|
 | 
						|
  var flush = function () {
 | 
						|
    var parent, fn;
 | 
						|
    if (isNode && (parent = process.domain)) parent.exit();
 | 
						|
    while (head) {
 | 
						|
      fn = head.fn;
 | 
						|
      head = head.next;
 | 
						|
      try {
 | 
						|
        fn();
 | 
						|
      } catch (e) {
 | 
						|
        if (head) notify();
 | 
						|
        else last = undefined;
 | 
						|
        throw e;
 | 
						|
      }
 | 
						|
    } last = undefined;
 | 
						|
    if (parent) parent.enter();
 | 
						|
  };
 | 
						|
 | 
						|
  // Node.js
 | 
						|
  if (isNode) {
 | 
						|
    notify = function () {
 | 
						|
      process.nextTick(flush);
 | 
						|
    };
 | 
						|
  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
 | 
						|
  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
 | 
						|
    var toggle = true;
 | 
						|
    var node = document.createTextNode('');
 | 
						|
    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
 | 
						|
    notify = function () {
 | 
						|
      node.data = toggle = !toggle;
 | 
						|
    };
 | 
						|
  // environments with maybe non-completely correct, but existent Promise
 | 
						|
  } else if (Promise && Promise.resolve) {
 | 
						|
    // Promise.resolve without an argument throws an error in LG WebOS 2
 | 
						|
    var promise = Promise.resolve(undefined);
 | 
						|
    notify = function () {
 | 
						|
      promise.then(flush);
 | 
						|
    };
 | 
						|
  // for other environments - macrotask based on:
 | 
						|
  // - setImmediate
 | 
						|
  // - MessageChannel
 | 
						|
  // - window.postMessag
 | 
						|
  // - onreadystatechange
 | 
						|
  // - setTimeout
 | 
						|
  } else {
 | 
						|
    notify = function () {
 | 
						|
      // strange IE + webpack dev server bug - use .call(global)
 | 
						|
      macrotask.call(global, flush);
 | 
						|
    };
 | 
						|
  }
 | 
						|
 | 
						|
  return function (fn) {
 | 
						|
    var task = { fn: fn, next: undefined };
 | 
						|
    if (last) last.next = task;
 | 
						|
    if (!head) {
 | 
						|
      head = task;
 | 
						|
      notify();
 | 
						|
    } last = task;
 | 
						|
  };
 | 
						|
};
 |