Skip to content

Instantly share code, notes, and snippets.

@jfsiii
Forked from mathiasbynens/setZeroTimeout.js
Created September 15, 2010 10:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jfsiii/580556 to your computer and use it in GitHub Desktop.
Save jfsiii/580556 to your computer and use it in GitHub Desktop.
/*! Cross-browser-compatible async
*
* I took Mathias' setZeroTimeout and changed it to async, based on http://fitzgeraldnick.com/weblog/35/. Some style changes (varible names, show logic first).
*
* I took the original setZeroTimeout and made it cross-browser-compatible, using setTimeout(fn, 0) as a fallback in case postMessage is not supported.
* Mathias Bynens <http://mathiasbynens.be/>
* See <http://mathiasbynens.be/notes/settimeout-onload>
*
* Copyright statement below:
*
* See <http://dbaron.org/log/20100309-faster-timeouts>
* By L. David Baron <dbaron@dbaron.org>, 2010-03-07, 2010-03-09
* Released under the following license:
*
* Copyright (c) 2010, The Mozilla Foundation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* - Redistributions of source code must retain the above copyright
* - notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* - notice, this list of conditions and the following disclaimer in
* - the documentation and/or other materials provided with the
* - distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
// BEGIN implementation of async
// Only add async to the window object, and hide everything else in a closure.
(function() {
var timeouts = [],
message_name = 'async-message',
outer = window;
if (outer.postMessage) {
if (outer.addEventListener) {
outer.addEventListener('message', handleMessage, true);
} else if (outer.attachEvent) {
outer.attachEvent('onmessage', handleMessage);
}
outer.async = postMessage;
} else {
outer.async = async;
}
// Like setTimeout, but only takes a function argument. There's
// no time argument (always zero) and no arguments (you have to
// use a closure).
function postMessage(fn) {
timeouts.push(fn);
outer.postMessage(message_name, '*');
}
function async(fn) {
outer.setTimeout(fn, 0);
}
function handleMessage(event) {
if (event.source == outer && event.data == message_name) {
if (event.stopPropagation) {
event.stopPropagation();
}
if (timeouts.length) {
(timeouts.shift())();
}
}
}
}());
// END implementation of async
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment