diff --git a/README.md b/README.md index 2a81f3d..315fef5 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,75 @@ -setImmediate.js -=============== +# setImmediate.js **A NobleJS production** -Introduction ------------- +## Introduction -A highly cross-browser implementation of the `setImmediate` and `clearImmediate` APIs, currently a -[W3C draft spec][spec] from the Web Performance Working Group. Allows scripts to yield to the browser, executing a -given operation asynchronously, in a manner that is typically more efficient and consumes less power than the usual -`setTimeout(..., 0)` pattern. +**setImmediate.js** is a highly cross-browser implementation of the `setImmediate` and `clearImmediate` APIs, currently +a [W3C draft spec][spec] from the Web Performance Working Group. `setImmediate` allows scripts to yield to the browser, +executing a given operation asynchronously, in a manner that is typically more efficient and consumes less power than +the usual `setTimeout(..., 0)` pattern. -Runs at "full speed" in the following browsers, using various clever tricks: +setImmediate.js runs at “full speed” in the following browsers and environments, using various clever tricks: * Internet Explorer 6+ * Firefox 3+ - * WebKit (exact cutoff unknown) + * WebKit * Opera 9.5+ + * Node.js + * Web workers in browsers that support `MessageChannel`, which I can't find solid info on. In all other browsers we fall back to using `setTimeout`, so it's always safe to use. -Reference pages ---------------- +## The Tricks + +### `process.nextTick` + +In Node.js versions below 0.9, `setImmediate` is not available, but [`process.nextTick`][nextTIck] is, so we use it to +shim support for a global `setImmediate`. In Node.js 0.9 and above, `setImmediate` is available. + +Note that we check for *actual* Node.js environments, not emulated ones like those produced by browserify or similar. +Such emulated environments often already include a `process.nextTick` shim that's not as browser-compatible as +setImmediate.js. + +### `postMessage` + +In Firefox 3+, Internet Explorer 9+, all modern WebKit browsers, and Opera 9.5+, [`postMessage`][postMessage] is +available and provides a good way to queue tasks on the event loop. It's quite the abuse, using a cross-document +messaging protocol within the same document simply to get access to the event loop task queue, but until there are +native implementations, this is the best option. + +Note that Internet Explorer 8 includes a synchronous version of `postMessage`. We detect this, or any other such +synchronous implementation, and fall back to another trick. + +### `MessageChannel` + +Unfortunately, `postMessage` has completely different semantics inside web workers, and so cannot be used there. So we +turn to [`MessageChannel`][MessageChannel], which has worse browser support, but does work inside a web worker. + +### `