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
			| 
											3 years ago
										 | 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; | ||
|  |   }; | ||
|  | }; |