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.
|
|
'use strict'; var globalThis = require('../internals/global-this'); var safeGetBuiltIn = require('../internals/safe-get-built-in'); var bind = require('../internals/function-bind-context'); var macrotask = require('../internals/task').set; var Queue = require('../internals/queue'); var IS_IOS = require('../internals/environment-is-ios'); var IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble'); var IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit'); var IS_NODE = require('../internals/environment-is-node');
var MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver; var document = globalThis.document; var process = globalThis.process; var Promise = globalThis.Promise; var microtask = safeGetBuiltIn('queueMicrotask'); var notify, toggle, node, promise, then;
// modern engines have queueMicrotask method
if (!microtask) { var queue = new Queue();
var flush = function () { var parent, fn; if (IS_NODE && (parent = process.domain)) parent.exit(); while (fn = queue.get()) try { fn(); } catch (error) { if (queue.head) notify(); throw error; } if (parent) parent.enter(); };
// browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
// also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) { 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 (!IS_IOS_PEBBLE && Promise && Promise.resolve) { // Promise.resolve without an argument throws an error in LG WebOS 2
promise = Promise.resolve(undefined); // workaround of WebKit ~ iOS Safari 10.1 bug
promise.constructor = Promise; then = bind(promise.then, promise); notify = function () { then(flush); }; // Node.js without promises
} else if (IS_NODE) { notify = function () { process.nextTick(flush); }; // for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessage
// - onreadystatechange
// - setTimeout
} else { // `webpack` dev server bug on IE global methods - use bind(fn, global)
macrotask = bind(macrotask, globalThis); notify = function () { macrotask(flush); }; }
microtask = function (fn) { if (!queue.head) notify(); queue.add(fn); }; }
module.exports = microtask;
|