Gathering detailed insights and metrics for setimmediate
Gathering detailed insights and metrics for setimmediate
Gathering detailed insights and metrics for setimmediate
Gathering detailed insights and metrics for setimmediate
A cross-browser implementation of the new setImmediate API.
npm install setimmediate
99.4
Supply Chain
62
Quality
75.3
Maintenance
100
Vulnerability
100
License
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
1,292 Stars
118 Commits
106 Forks
41 Watching
3 Branches
14 Contributors
Updated on 11 Nov 2024
Minified
Minified + Gzipped
JavaScript (92.44%)
HTML (7.56%)
Cumulative downloads
Total Downloads
Last day
-8%
3,432,418
Compared to previous day
Last week
1.8%
20,038,432
Compared to previous week
Last month
13.1%
81,960,907
Compared to previous month
Last year
3.9%
842,005,610
Compared to previous year
5
A YuzuJS production
setImmediate.js is a highly cross-browser implementation of the setImmediate
and clearImmediate
APIs, proposed by Microsoft to 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.
setImmediate.js runs at “full speed” in the following browsers and environments, using various clever tricks:
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.
The setImmediate
API, as specified, gives you access to the environment's task queue, sometimes known as its "macrotask" queue. This is crucially different from the microtask queue used by web features such as MutationObserver
, language features such as promises and Object.observe
, and Node.js features such as process.nextTick
. Each go-around of the macrotask queue yields back to the event loop once all queued tasks have been processed, even if the macrotask itself queued more macrotasks. Whereas, the microtask queue will continue executing any queued microtasks until it is exhausted.
In practice, what this means is that if you call setImmediate
inside of another task queued with setImmediate
, you will yield back to the event loop and any I/O or rendering tasks that need to take place between those calls, instead of executing the queued task as soon as possible.
If you are looking specifically to yield as part of a render loop, consider using requestAnimationFrame
; if you are looking solely for the control-flow ordering effects, use a microtask solution such as asap.
process.nextTick
In Node.js versions below 0.9, setImmediate
is not available, but process.nextTick
is—and in those versions, process.nextTick
uses macrotask semantics. So, we use it to shim support for a global setImmediate
.
In Node.js 0.9 and above, process.nextTick
moved to microtask semantics, but setImmediate
was introduced with macrotask semantics, so there's no need to polyfill anything.
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
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
, which has worse browser support, but does work inside a web worker.
<script> onreadystatechange
For our last trick, we pull something out to make things fast in Internet Explorer versions 6 through 8: namely, creating a <script>
element and firing our calls in its onreadystatechange
event. This does execute in a future turn of the event loop, and is also faster than setTimeout(…, 0)
, so hey, why not?
In the browser, include it with a <script>
tag; pretty simple.
In Node.js, do
npm install --save setimmediate
then
1require("setimmediate"); // (somewhere early in your app; it attaches to the global scope.)
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
0 existing vulnerabilities detected
Reason
license file detected
Details
Reason
Found 4/28 approved changesets -- score normalized to 1
Reason
0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2024-11-18
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More