UNPKG

@reactivex/rxjs

Version:

Reactive Extensions for modern JavaScript

294 lines (284 loc) 16.8 kB
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <base data-ice="baseUrl" href="../../../"> <title data-ice="title">es6/util/Immediate.js | RxJS API Document</title> <link type="text/css" rel="stylesheet" href="css/style.css"> <link type="text/css" rel="stylesheet" href="css/prettify-tomorrow.css"> <script src="script/prettify/prettify.js"></script> <script src="script/manual.js"></script> <script data-ice="userScript" src="user/script/0-Rx.js"></script> <script data-ice="userScript" src="user/script/1-devtools-welcome.js"></script> <script data-ice="userScript" src="user/script/2-custom-manual-styles.js"></script> <script data-ice="userScript" src="user/script/3-decision-tree-widget.min.js"></script> <script data-ice="userScript" src="user/script/4-theme-toggler.js"></script> <link data-ice="userStyle" rel="stylesheet" href="user/css/0-main.css"> </head> <body class="layout-container" data-ice="rootContainer"> <header> <a href="./">Home</a> <a href="./manual/index.html" data-ice="manualHeaderLink">Manual</a> <a href="identifiers.html">Reference</a> <a href="source.html">Source</a> <a href="test.html" data-ice="testLink">Test</a> <a data-ice="repoURL" href="https://github.com/ReactiveX/RxJS" class="repo-url-github">Repository</a> <div class="search-box"> <span> <img src="./image/search.png"> <span class="search-input-edge"></span><input class="search-input"><span class="search-input-edge"></span> </span> <ul class="search-result"></ul> </div> </header> <nav class="navigation" data-ice="nav"><div> <ul> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-AsyncSubject">AsyncSubject</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-BehaviorSubject">BehaviorSubject</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Notification">Notification</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Observable">Observable</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-ReplaySubject">ReplaySubject</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Scheduler">Scheduler</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-AnonymousSubject">AnonymousSubject</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Subject">Subject</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-SubjectSubscriber">SubjectSubscriber</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Subscriber">Subscriber</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Subscription">Subscription</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-Rx.Scheduler">Rx.Scheduler</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-typedef">T</span><span data-ice="name"><span><a href="typedef/index.html#static-typedef-Rx.Symbol">Rx.Symbol</a></span></span></li> <li data-ice="doc"><div data-ice="dirPath" class="nav-dir-path">observable</div><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-ConnectableObservable">ConnectableObservable</a></span></span></li> <li data-ice="doc"><div data-ice="dirPath" class="nav-dir-path">observable/dom</div><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-AjaxError">AjaxError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-AjaxResponse">AjaxResponse</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-AjaxTimeoutError">AjaxTimeoutError</a></span></span></li> <li data-ice="doc"><div data-ice="dirPath" class="nav-dir-path">operator</div><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-GroupedObservable">GroupedObservable</a></span></span></li> <li data-ice="doc"><div data-ice="dirPath" class="nav-dir-path">scheduler</div><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-Action">Action</a></span></span></li> <li data-ice="doc"><div data-ice="dirPath" class="nav-dir-path">util</div><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-ArgumentOutOfRangeError">ArgumentOutOfRangeError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-EmptyError">EmptyError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-ObjectUnsubscribedError">ObjectUnsubscribedError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-TimeoutError">TimeoutError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-UnsubscriptionError">UnsubscriptionError</a></span></span></li> <li data-ice="doc"><span data-ice="kind" class="kind-variable">V</span><span data-ice="name"><span><a href="variable/index.html#static-variable-root">root</a></span></span></li> </ul> </div> </nav> <div class="content" data-ice="content"><h1 data-ice="title">es6/util/Immediate.js</h1> <pre class="source-code line-number raw-source-code"><code class="prettyprint linenums" data-ice="content">/** Some credit for this helper goes to http://github.com/YuzuJS/setImmediate */ import { root } from &apos;./root&apos;; export var ImmediateDefinition = (function () { function ImmediateDefinition(root) { this.root = root; if (root.setImmediate &amp;&amp; typeof root.setImmediate === &apos;function&apos;) { this.setImmediate = root.setImmediate.bind(root); this.clearImmediate = root.clearImmediate.bind(root); } else { this.nextHandle = 1; this.tasksByHandle = {}; this.currentlyRunningATask = false; // Don&apos;t get fooled by e.g. browserify environments. if (this.canUseProcessNextTick()) { // For Node.js before 0.9 this.setImmediate = this.createProcessNextTickSetImmediate(); } else if (this.canUsePostMessage()) { // For non-IE10 modern browsers this.setImmediate = this.createPostMessageSetImmediate(); } else if (this.canUseMessageChannel()) { // For web workers, where supported this.setImmediate = this.createMessageChannelSetImmediate(); } else if (this.canUseReadyStateChange()) { // For IE 6&#x2013;8 this.setImmediate = this.createReadyStateChangeSetImmediate(); } else { // For older browsers this.setImmediate = this.createSetTimeoutSetImmediate(); } var ci = function clearImmediate(handle) { delete clearImmediate.instance.tasksByHandle[handle]; }; ci.instance = this; this.clearImmediate = ci; } } ImmediateDefinition.prototype.identify = function (o) { return this.root.Object.prototype.toString.call(o); }; ImmediateDefinition.prototype.canUseProcessNextTick = function () { return this.identify(this.root.process) === &apos;[object process]&apos;; }; ImmediateDefinition.prototype.canUseMessageChannel = function () { return Boolean(this.root.MessageChannel); }; ImmediateDefinition.prototype.canUseReadyStateChange = function () { var document = this.root.document; return Boolean(document &amp;&amp; &apos;onreadystatechange&apos; in document.createElement(&apos;script&apos;)); }; ImmediateDefinition.prototype.canUsePostMessage = function () { var root = this.root; // The test against `importScripts` prevents this implementation from being installed inside a web worker, // where `root.postMessage` means something completely different and can&apos;t be used for this purpose. if (root.postMessage &amp;&amp; !root.importScripts) { var postMessageIsAsynchronous_1 = true; var oldOnMessage = root.onmessage; root.onmessage = function () { postMessageIsAsynchronous_1 = false; }; root.postMessage(&apos;&apos;, &apos;*&apos;); root.onmessage = oldOnMessage; return postMessageIsAsynchronous_1; } return false; }; // This function accepts the same arguments as setImmediate, but // returns a function that requires no arguments. ImmediateDefinition.prototype.partiallyApplied = function (handler) { var args = []; for (var _i = 1; _i &lt; arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var fn = function result() { var _a = result, handler = _a.handler, args = _a.args; if (typeof handler === &apos;function&apos;) { handler.apply(undefined, args); } else { (new Function(&apos;&apos; + handler))(); } }; fn.handler = handler; fn.args = args; return fn; }; ImmediateDefinition.prototype.addFromSetImmediateArguments = function (args) { this.tasksByHandle[this.nextHandle] = this.partiallyApplied.apply(undefined, args); return this.nextHandle++; }; ImmediateDefinition.prototype.createProcessNextTickSetImmediate = function () { var fn = function setImmediate() { var instance = setImmediate.instance; var handle = instance.addFromSetImmediateArguments(arguments); instance.root.process.nextTick(instance.partiallyApplied(instance.runIfPresent, handle)); return handle; }; fn.instance = this; return fn; }; ImmediateDefinition.prototype.createPostMessageSetImmediate = function () { // Installs an event handler on `global` for the `message` event: see // * https://developer.mozilla.org/en/DOM/window.postMessage // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages var root = this.root; var messagePrefix = &apos;setImmediate$&apos; + root.Math.random() + &apos;$&apos;; var onGlobalMessage = function globalMessageHandler(event) { var instance = globalMessageHandler.instance; if (event.source === root &amp;&amp; typeof event.data === &apos;string&apos; &amp;&amp; event.data.indexOf(messagePrefix) === 0) { instance.runIfPresent(+event.data.slice(messagePrefix.length)); } }; onGlobalMessage.instance = this; root.addEventListener(&apos;message&apos;, onGlobalMessage, false); var fn = function setImmediate() { var _a = setImmediate, messagePrefix = _a.messagePrefix, instance = _a.instance; var handle = instance.addFromSetImmediateArguments(arguments); instance.root.postMessage(messagePrefix + handle, &apos;*&apos;); return handle; }; fn.instance = this; fn.messagePrefix = messagePrefix; return fn; }; ImmediateDefinition.prototype.runIfPresent = function (handle) { // From the spec: &apos;Wait until any invocations of this algorithm started before this one have completed.&apos; // So if we&apos;re currently running a task, we&apos;ll need to delay this invocation. if (this.currentlyRunningATask) { // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a // &apos;too much recursion&apos; error. this.root.setTimeout(this.partiallyApplied(this.runIfPresent, handle), 0); } else { var task = this.tasksByHandle[handle]; if (task) { this.currentlyRunningATask = true; try { task(); } finally { this.clearImmediate(handle); this.currentlyRunningATask = false; } } } }; ImmediateDefinition.prototype.createMessageChannelSetImmediate = function () { var _this = this; var channel = new this.root.MessageChannel(); channel.port1.onmessage = function (event) { var handle = event.data; _this.runIfPresent(handle); }; var fn = function setImmediate() { var _a = setImmediate, channel = _a.channel, instance = _a.instance; var handle = instance.addFromSetImmediateArguments(arguments); channel.port2.postMessage(handle); return handle; }; fn.channel = channel; fn.instance = this; return fn; }; ImmediateDefinition.prototype.createReadyStateChangeSetImmediate = function () { var fn = function setImmediate() { var instance = setImmediate.instance; var root = instance.root; var doc = root.document; var html = doc.documentElement; var handle = instance.addFromSetImmediateArguments(arguments); // Create a &lt;script&gt; element; its readystatechange event will be fired asynchronously once it is inserted // into the document. Do so, thus queuing up the task. Remember to clean up once it&apos;s been called. var script = doc.createElement(&apos;script&apos;); script.onreadystatechange = function () { instance.runIfPresent(handle); script.onreadystatechange = null; html.removeChild(script); script = null; }; html.appendChild(script); return handle; }; fn.instance = this; return fn; }; ImmediateDefinition.prototype.createSetTimeoutSetImmediate = function () { var fn = function setImmediate() { var instance = setImmediate.instance; var handle = instance.addFromSetImmediateArguments(arguments); instance.root.setTimeout(instance.partiallyApplied(instance.runIfPresent, handle), 0); return handle; }; fn.instance = this; return fn; }; return ImmediateDefinition; }()); export var Immediate = new ImmediateDefinition(root); //# sourceMappingURL=Immediate.js.map</code></pre> </div> <footer class="footer"> Generated by <a href="https://esdoc.org">ESDoc<span data-ice="esdocVersion">(0.4.8)</span></a> </footer> <script src="script/search_index.js"></script> <script src="script/search.js"></script> <script src="script/pretty-print.js"></script> <script src="script/inherited-summary.js"></script> <script src="script/test-summary.js"></script> <script src="script/inner-link.js"></script> <script src="script/patch-for-local.js"></script> </body> </html>