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;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 |