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 🙏

© 2026 – Pkg Stats / Ryan Hefner

for-promise

v2.0.5

Published

A lightweight utility to run async loops with full control using Promises — like for, forEach, and while, but smarter.

Readme

ForPromise-JS

ForPromise-JS is a lightweight utility for running asynchronous scripts in sequence — like a for, forEach, or while loop — but fully promise-based and with complete control over each iteration.

This module helps you run multiple asynchronous operations (Promises or callbacks) in an ordered, controlled flow within a single await call.

Instead of juggling multiple Promise instances inside regular loop structures (which can get messy or execute out of order), ForPromise-JS executes them sequentially, instantly, and cleanly — all inside one master Promise.


✨ Key Features:

  • Works with arrays, objects, numbers, and custom while conditions.
  • Supports fn() and fn_error() callbacks.
  • Allows break, forceResult, dontSendResult, and even nested async loops.
  • Simple await-based usage — no need for external async/await handling inside the loop.

Perfect for replacing async logic inside for/forEach/while scripts — but safer and smarter.

📘 Usage Examples

🔁 Basic Loop: Number as Loop Count

Execute a loop a fixed number of times (like a traditional for loop).

// Import the module
import forPromise from 'for-promise';

// Loop will run 10 times
const dataCount = 10;

// Run the loop
await forPromise({ data: dataCount }, (index, result) => {
    
    // Display the current index
    console.log(`The index value is '${index}'.`);

    // Call result() to mark this iteration as complete
    result();

});

🧾 Looping Through Arrays or Objects

You can also loop through an array or object and handle asynchronous logic inside.

// Import the module
import forPromise from 'for-promise';
import fs from 'fs';

// Sample array
const data = [1, 2, 3, 4, 5];

// Loop through each index
await forPromise({ data }, (index, result, error) => {

    // Print current index and value
    console.log(`The index '${index}' has value '${data[index]}'.`);

    // Async operation: reading a directory
    fs.readdir('/some/folder/path', (err, files) => {

        if (!err) {
            // Success: mark the iteration as completed
            result();
        } else {
            // Error: interrupt the loop and reject the promise
            error(err);
        }

    });

});

➕ Adding Extra Loops Dynamically

Use extra() to add another loop from inside your main loop — perfect for nested async iterations!

// Import the module
import forPromise from 'for-promise';
import fs from 'fs';

// First dataset
const data1 = [1, 2, 3];
const data2 = [4, 5, 6];

// Outer loop
await forPromise({ data: data1 }, (index, result, error, extra) => {

    console.log(`Outer index '${index}' has value '${data1[index]}'.`);

    // Add a nested loop dynamically
    const extraLoop = extra({ data: data2 });

    // Run the nested loop
    extraLoop.run((index2, result2, error2) => {
        console.log(`  Inner index '${index2}' has value '${data2[index2]}'.`);

        fs.readdir('/another/folder', (err, files) => {
            if (!err) result2();
            else error2(err);
        });
    });

    // Continue outer loop
    result();

});

🔁 Execute a "Do While" Loop

Use the type: 'while' option to run a loop that repeats while a condition remains true — similar to a classic do...while structure.

// Import the module
import forPromise from 'for-promise';

// Data object to track the condition
const whileData = { count: 0 };

// Run the "do while" loop
await forPromise({

    // Set the loop type
    type: 'while',
    while: whileData,

    // Condition checker (must return true or false)
    checker: () => {
        return (whileData.count < 3);
    }

}, (done, error) => {

    // Loop body: will execute at least once
    console.log(`Do: ${whileData.count}`);

    // Update value
    whileData.count++;

    // Mark iteration as complete
    done();

});

💡 This script will print:

Do: 0  
Do: 1  
Do: 2  

🛑 Execute a "For Script" with Break FN

Use fn(true) inside the loop callback to force a break, just like a break statement in traditional for loops.

// Import the module
import forPromise from 'for-promise';

// Start the loop
await forPromise({
    data: [1, 2, 3]
}, (item, done) => {

    // Show the current item
    console.log(`Array with Force Break: ${item}`);

    // Break the loop immediately
    done(true);

});

💡 This will only execute once and stop the entire loop.

Array with Force Break: 1

You can use this when you need to exit early based on a certain condition, just like break in native loops.

🧠 Execute a "For Script" with forceResult, break, and dontSendResult

Use the fn() function with advanced options to control how the loop behaves and what result it returns.

// Import the module
import forPromise from 'for-promise';

// Example: Use filesystem
import fs from 'fs';
import path from 'path';

// Start the loop
await forPromise({
    data: [1, 2, 3]
}, (item, done, fail) => {

    // Async example: read a folder
    fs.readdir(path.join(__dirname, './folder'), (err, files) => {

        if (!err) {
            console.log(`Force Break used to read this data: ${item}`);
            console.log(files);

            // ✅ Mark this result as the final result and end all execution
            done({ forceResult: true });
        } else {
            // ❌ Stop execution and return the error
            fail(err);
        }

    });

    // 🛑 Stop further execution without returning a result
    done({ break: true, dontSendResult: true });

});

🔍 Behavior Summary

  • forceResult: true: Immediately ends the loop and returns this value as the final result.
  • break: true: Stops the loop like a normal break.
  • dontSendResult: true: Suppresses the current iteration result from being stored or returned.

💡 You can combine forceResult, break, and dontSendResult as needed to fully control the loop's execution and return behavior.


🧠 This documentation was written with the help of AI assistance (ChatGPT by OpenAI) to ensure clarity, structure, and language accuracy.