JSFiddle - React, Tailwind, and code Playground

by jfriend00

JavaScript

let conditions = 0;

function runMatchIteration(data, offset, limit) {
    let keys = data.slice(offset);
    return keys.reduce((p, val) => {
        return p.then(entities => {
            // if entities is not yet full
            if (entities.length < limit) {
                return readEntity(val).then(instance => {
                    return matchInstance(instance, conditions).then(isMatch => {
                        if (isMatch) {
                            entities.push(instance);
                        }
                        return entities;
                    });
                });
            } else {
                return entities;
            }
        });
    }, Promise.resolve([]));
}

function readEntity(val) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(val);
        }, 50);
    });
}

function matchInstance(instance, conditions) {
    return new Promise(resolve => {
        setTimeout(() => {
            // make a 2/3 chance of resolving true
            resolve(Math.random() > 0.33);
        }, 50);
    });
}

let d = [1,2,3,4,5,6,7,8,9];

runMatchIteration(d, 0, 5).then(result => {
    console.log(result);
});