Socket
Book a DemoInstallSign in
Socket

yieldtomain

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

yieldtomain

A utility function to yield to the main thread in JavaScript

latest
npmnpm
Version
1.0.3
Version published
Maintainers
1
Created
Source

yieldToMain

A utility function to yield execution to the main thread in JavaScript, preventing UI blocking. Uses scheduler.yield() when available, falling back to setTimeout.

The gist is this:

function yieldToMain() {
  const scheduler = globalThis.scheduler;
  if (scheduler && typeof scheduler.yield === 'function') {
    return scheduler.yield();
  }
  return new Promise((resolve) => {
    setTimeout(resolve, 0);
  });
}

Feel free to copy and paste this into your codebase. Or continue with using it as a module etc., as described below.

Installation

npm install yieldtomain

Usage

The library can be used in a bunch o' JavaScript environments:

ES Modules

import yieldToMain from 'yieldtomain';

async function processItems(items) {
  for (const item of items) {
    await yieldToMain();
    // Process item
  }
}

CommonJS

const yieldToMain = require('yieldtomain');

async function heavyTask() {
  for (let i = 0; i < 1000000; i++) {
    if (i % 1000 === 0) await yieldToMain();
    // Compute something
  }
}

Browser

<script src="dist/yieldToMain.browser.js"></script>
<script>
  async function nonBlockingTask() {
    for (let i = 0; i < 1000000; i++) {
      if (i % 1000 === 0) await yieldToMain();
      // Heavy computation
    }
  }
</script>

Demo

Check out the examples/heavy.html demo to see the difference between blocking and non-blocking computations. The demo includes:

  • A counter animation to visualize thread blocking
  • Pure computation examples (where "pure" means a JS loop without any DOM involvement)
  • DOM access in addition to computations
  • Multiple runs while reporting the median

A live version of the demo is right here.

Build Formats

The library is distributed in multiple formats:

  • dist/yieldToMain.esm.js - ECMAScript Module
  • dist/yieldToMain.cjs.js - CommonJS
  • dist/yieldToMain.browser.js - Minified browser build with an IIFE that provides a global yieldToMain() function

All builds include source maps and TypeScript type definitions.

API

function yieldToMain(): Promise<void>;

The function returns a Promise that resolves after yielding execution to the main thread. It uses:

  • scheduler.yield() if available
  • setTimeout(0) fallback

Development

# Install dependencies
npm install

# Build all formats and types
npm run build

# Run tests
npm test

# Run tests in watch mode
npm run test:watch

License

MIT

Further Reading

The yieldToMain() function is in no way my invention, I was just surprised it's not widely available in npm, so I decided to create a package for it. It's like a folk song that everyone knows, and yet it's origins are a little mirky. For more nitty-gritty details here's a selection of light (haha!) reading:

Keywords

yield

FAQs

Package last updated on 05 Jun 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts