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.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							2.4 KiB
						
					
					
				var global = require('../internals/global'); | 
						|
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f; | 
						|
var classof = require('../internals/classof-raw'); | 
						|
var macrotask = require('../internals/task').set; | 
						|
var IS_IOS = require('../internals/engine-is-ios'); | 
						|
 | 
						|
var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; | 
						|
var process = global.process; | 
						|
var Promise = global.Promise; | 
						|
var IS_NODE = classof(process) == 'process'; | 
						|
// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` | 
						|
var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); | 
						|
var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; | 
						|
 | 
						|
var flush, head, last, notify, toggle, node, promise, then; | 
						|
 | 
						|
// modern engines have queueMicrotask method | 
						|
if (!queueMicrotask) { | 
						|
  flush = function () { | 
						|
    var parent, fn; | 
						|
    if (IS_NODE && (parent = process.domain)) parent.exit(); | 
						|
    while (head) { | 
						|
      fn = head.fn; | 
						|
      head = head.next; | 
						|
      try { | 
						|
        fn(); | 
						|
      } catch (error) { | 
						|
        if (head) notify(); | 
						|
        else last = undefined; | 
						|
        throw error; | 
						|
      } | 
						|
    } last = undefined; | 
						|
    if (parent) parent.enter(); | 
						|
  }; | 
						|
 | 
						|
  // Node.js | 
						|
  if (IS_NODE) { | 
						|
    notify = function () { | 
						|
      process.nextTick(flush); | 
						|
    }; | 
						|
  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 | 
						|
  } else if (MutationObserver && !IS_IOS) { | 
						|
    toggle = true; | 
						|
    node = document.createTextNode(''); | 
						|
    new MutationObserver(flush).observe(node, { characterData: true }); | 
						|
    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 | 
						|
    promise = Promise.resolve(undefined); | 
						|
    then = promise.then; | 
						|
    notify = function () { | 
						|
      then.call(promise, 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); | 
						|
    }; | 
						|
  } | 
						|
} | 
						|
 | 
						|
module.exports = queueMicrotask || function (fn) { | 
						|
  var task = { fn: fn, next: undefined }; | 
						|
  if (last) last.next = task; | 
						|
  if (!head) { | 
						|
    head = task; | 
						|
    notify(); | 
						|
  } last = task; | 
						|
};
 | 
						|
 |