npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

single-concurrent

v1.0.0

Published

Ensures that only one 'instance' of an asynchronous process is running at any given time

Downloads

7

Readme

single-concurrent

Small utility function to ensure that you're not running two copies of an asynchronous procedure at once.

Particularly useful for cases where you have some sort of processing loop that gets kicked off by a specific event, but that should only do so if it isn't already running.

Works with any function that returns a Promise (so this includes async functions).

Example

"use strict";

const singleConcurrent = require("single-concurrent");

(async function () {
	let trySomeAsyncProcess = singleConcurrent(async function someAsyncProcess() {
		// Let's pretend that this is some long-running task that internally recurses
		console.log("started some async process");
		await new Promise((resolve) => {
			setTimeout(resolve, Math.random() * 2000);
		});
		console.log("finished some async process");
	});

	trySomeAsyncProcess();
	trySomeAsyncProcess(); // oops! it was already running and we tried to run it again
})();

/* Output (note how it's only output once):

started some async process
finished some async process
*/

API

singleConcurrent(callback)

  • callback: The function that does the actual work, and that should only be run one at a time. This must return a Promise! A function marked async also meets that requirement by default.

Returns: A wrapper function that will only execute the callback if one is not already in progress; it passes through the arguments and return value (assuming the underlying callback is actually run, of course).

If the returned wrapper function is called while the procedure is still running, the call is simply ignored and synchronously returns with undefined. Once the underlying async procedure finishes, a call to the wrapper function will activate the underlying callback again, so it can be reused - it just prevents multiple runs from occurring simultaneously.