I am working on simple XML dashboard in Splunk to compute and display infra requirements for new Splunk environment. Below is an excerpt from the code which I am not able to get right:
    $(document).on('click', '#submitDemand', function(e) {
    e.preventDefault();
    //hostname, ip, storage, ram, os, component, cores
    indexers = indexernum($('[name="form_totalgb"]').val());
    console.log(indexers);
    shs = shnum($('[name="form_totalgb"]').val());
    console.log(shs);
    spinfraTableSearch = new SearchManager({
        id: "search2",
        search: "| inputlookup dm_splunk_infra_lookup| search demand_id=" + demand_id + " | table provisioned_hostname, provisioned_ip, splunk_component, cpu_cores, ram, storage_tb, os",
        preview: true,
        autostart: false,
        cache: true
    });
    spInfraCleanSearch = new SearchManager({
        id: "cleansearch",
        search: "| inputlookup dm_splunk_infra_lookup | eval key=_key | WHERE NOT demand_id=" + demand_id + " | outputlookup dm_splunk_infra_lookup",
        preview: true,
        autostart: false,
        cache: true
    });
    hf1search = new SearchManager({
        id: "hf1",
        search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"HeavyForwarder1\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"8 GB\"| eval os = \"Windows\"| eval splunk_component = \"Heavy Forwarder\"| eval cpu_cores = \"8\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
        preview: true,
        autostart: false,
        cache: true
    });
    hf2search = new SearchManager({
        id: "hf2",
        search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"HeavyForwarder2\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"8 GB\"| eval os = \"Linux\"| eval splunk_component = \"Heavy Forwarder\"| eval cpu_cores = \"8\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
        preview: true,
        autostart: false,
        cache: true
    });
    dssearch = new SearchManager({
        id: "ds",
        search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"DeploymentServer\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"8 GB\"| eval os = \"Linux\"| eval splunk_component = \"Deployment Server\"| eval cpu_cores = \"8\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
        preview: true,
        autostart: false,
        cache: true
    });
    //spInfraTokens("DeploymentServer", "53.xx.xxx.xxx", "0.5 TB", "8 GB", "Linux", "Deployment Server", "8");
    if (indexers > 1) {
        cmsearch = new SearchManager({
            id: "cm",
            search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"ClusterMaster\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"8 GB\"| eval os = \"Linux\"| eval splunk_component = \"Cluster Master\"| eval cpu_cores = \"8\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
            preview: true,
            autostart: false,
            cache: true
        });
    }
    for (i = 0; i < indexers; i++) {
        idxsearch[i] = new SearchManager({
            id: "idx" + i,
            search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"Indexer" + (i + 1) + "\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"" + ($('[name="form_totalstorage"]').val() / indexers) + " TB\"| eval ram = \"64 GB\"| eval os = \"Linux\"| eval splunk_component = \"Indexer\"| eval cpu_cores = \"24\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
            preview: true,
            autostart: false,
            cache: true
        });
    }
    //console.log(idxsearch);
    if (shs > 1) {
        depsearch = new SearchManager({
            id: "dep",
            search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"Deployer\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"8 GB\"| eval os = \"Linux\"| eval splunk_component = \"Deployer\"| eval cpu_cores = \"8\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
            preview: true,
            autostart: false,
            cache: true
        });
    }
    for (i = 0; i < shs; i++) {
        shssearch[i] = new SearchManager({
            id: "shs" + i,
            search: "| inputlookup dm_splunk_infra_lookup | append [stats count| eval demand_id =" + demand_id + "| eval provisioned_hostname =\"SearchHead" + (i + 1) + "\" | eval provisioned_ip = \"53.xx.xxx.xxx\"| eval storage_tb = \"0.5 TB\"| eval ram = \"32 GB\"| eval os = \"Linux\"| eval splunk_component = \"Search Head\"| eval cpu_cores = \"16\" ] | table demand_id, provisioned_hostname, provisioned_ip, storage_tb, ram, os, splunk_component, cpu_cores| outputlookup dm_splunk_infra_lookup",
            preview: true,
            autostart: false,
            cache: true
        });
    }
    spInfraCleanSearch.startSearch();
    spInfraCleanSearch.on('search:done', function() {
        console.log('cleanup completed');
        hf1search.startSearch();
        spInfraTokens();
    });
    hf1search.on('search:done', function() {
        console.log('hf1 completed');
        spinfraTableSearch.startSearch();
        hf2search.startSearch();
        spInfraTokens();
    });
    hf2search.on('search:done', function() {
        console.log('hf2 completed');
        spinfraTableSearch.startSearch();
        dssearch.startSearch();
        spInfraTokens();
    });
    dssearch.on('search:done', function() {
        console.log('ds completed');
        if (indexers > 1) {
            console.log('start cmsearch');
            spinfraTableSearch.startSearch();
            cmsearch.startSearch();
            cmsearch.on('search:done', function() {
                console.log('cm completed');
                console.log('start idxsearch[0]');
                spinfraTableSearch.startSearch();
                idxsearch[0].startSearch();
            });
        } else {
            console.log('start idxsearch[0]');
            spinfraTableSearch.startSearch();
            idxsearch[0].startSearch();
            idxsearch[0].on('search:done', function() {
                console.log('idx0 completed');
                console.log('start shssearch[0]');
                spinfraTableSearch.startSearch();
                shssearch[0].startSearch();
            });
        }
    });
    var i = 1;
    for (i = 1; i < indexers; i++) {
        console.log('in for register idx[' + (i - 1) + ']');
        idxsearch[i - 1].on('search:done', function() {
            console.log('idx' + (i - 1) + ' completed');
            console.log('start idxsearch[' + i + ']');
            spinfraTableSearch.startSearch();
            idxsearch[i].startSearch();
        });
    }
    if (shs > 1) {
        console.log('register idx[' + (i - 1) + ']');
        idxsearch[i - 1].on('search:done', function() {
            console.log('idx' + (i - 1) + ' completed');
            console.log('start depsearch');
            spinfraTableSearch.startSearch();
            depsearch.startSearch();
        });
        console.log('register deployer');
        depsearch.on('search:done', function() {
            console.log('deployer completed');
            console.log('start shssearch[0]');
            spinfraTableSearch.startSearch();
            shssearch[0].startSearch();
        });
    } else {
        console.log('register idx[' + (i - 1) + ']');
        idxsearch[i - 1].on('search:done', function() {
            console.log('idx' + (i - 1) + ' completed');
            console.log('start shssearch[0]');
            spinfraTableSearch.startSearch();
            shssearch[0].startSearch();
            console.log('register shs[0]');
            shssearch[0].on('search:done', function() {
                console.log('shs0 completed');
                spinfraTableSearch.startSearch();
                spInfraTokens();
            });
        });
    }
    var i = 1;
    for (i = 1; i < shs; i++) {
        console.log('register shs[' + (i - 1) + ']');
        shssearch[i - 1].on('search:done', function() {
            console.log('shs' + (i - 1) + ' completed');
            console.log('start shssearch[' + i + ']');
            spinfraTableSearch.startSearch();
            shssearch[i].startSearch();
        });
    }
    console.log('register shs[' + (i - 1) + ']');
    shssearch[i - 1].on('search:done', function() {
        console.log('shs' + (i - 1) + ' completed');
        spinfraTableSearch.startSearch();
        spInfraTokens();
    });
});
createSpInfra.on('search:done', function() {
    console.log('createspinfra completed');
    spinfraTableSearch.startSearch();
    tokens.unset('tok_sp_create');
});
spinfraTable.on('click', function(e) {
    e.preventDefault();
});
As you know, this function is called when submit is clicked and I have included console.log() to debug the code, please excuse the quick/dirty nature. For variables indexers and shs, values 3 and 2 produces below output:
3
2
in for register idx[0]
in for register idx[1]
register idx[2]
register deployer
register shs[0]
register shs[1]
cleanup completed
hf1 completed
hf2 completed
ds completed
start cmsearch
cm completed
start idxsearch[0]
idx1 completed
start idxsearch[2]
idx1 completed
start depsearch
deployer completed
start shssearch[0]
shs1 completed
start shssearch[2]
Uncaught TypeError: Cannot read property 'startSearch' of undefined
    at constructor.<anonymous> (crud_set_types.js:564:18)
    at triggerEvents (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:5040)
    at constructor.trigger (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:3949)
    at Backbone.Model.done (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:341:24540)
    at triggerEvents (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:4974)
    at Backbone.Model.trigger (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:3949)
    at http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:383:6359
    at Array.forEach (<anonymous>)
    at Function._.each._.forEach (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:27:10608)
    at _.(anonymous function) [as each] (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:27:27948)
shs1 completed
start shssearch[2]
Uncaught TypeError: Cannot read property 'startSearch' of undefined
    at constructor.<anonymous> (crud_set_types.js:564:18)
    at triggerEvents (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:5040)
    at constructor.trigger (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:3949)
    at Backbone.Model.done (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:341:24540)
    at triggerEvents (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:4974)
    at Backbone.Model.trigger (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:29:3949)
    at http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:383:6359
    at Array.forEach (<anonymous>)
    at Function._.each._.forEach (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:27:10608)
    at _.(anonymous function) [as each] (http://130.211.253.134:8000/en-US/static/@CB1E2AFE6D77CD53A7CEF5DF0465A971197F39141EDB7D8858CA184912B21663.1/build/pages/enterprise/common.js:27:27948)
shs1 completed
start shssearch[2]
and shs1/shssearch[2] keeps on repeating 
I am not able to figure out why while executing indexer loop, start idxsearch[1] is not executed even though idx[0], idx[1] and idx[2] are registered. 
Similarly in shs block, start shssearch[1] should be called not start shssearch[2]. Further the shs for loop should not execute if i=2 but here it becomes as infinite loop.
Any help in this matter is appreciated. I am stuck in this since weeks and have rewritten this at least 4 times.
Best Regards, Nikhil
Edit: Shorter version:
     var i = 1;
for (i = 1; i < indexers; i++) {
    console.log('in for register idx[' + (i - 1) + ']');
    idxsearch[i - 1].on('search:done', function() {
        console.log('idx' + (i - 1) + ' completed');
        console.log('start idxsearch[' + i + ']');
        spinfraTableSearch.startSearch();
        idxsearch[i].startSearch();
    });
}
Output:
    start idxsearch[0]
    idx1 completed
    start idxsearch[2]
Issue: idx0 completed, start idxsearch[1] and idx1 completed are missing. Those piece of code should be executed
Code2:
    var i = 1;
for (i = 1; i < shs; i++) {
    console.log('register shs[' + (i - 1) + ']');
    shssearch[i - 1].on('search:done', function() {
        console.log('shs' + (i - 1) + ' completed');
        console.log('start shssearch[' + i + ']');
        spinfraTableSearch.startSearch();
        shssearch[i].startSearch();
    });
Issue: similar problem shs0 completed and start shssearch[1] are missing. And this is in infinite loop where as value of i as 2 should restrict it.
