Loop with promise

by Jernej Slejko

HTML

<script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
<pre id="output"></pre>

JavaScript

// http://stackoverflow.com/a/21524239/1768303

(function () {
    "use strict";
    
    var output = document.getElementById("output");
    var outputText = document.createTextNode("");
    output.appendChild(outputText);
    
    var _closest = ["x1", "x2", "x3"];
    var _routes = [];
    
    function printOutput(line) {
        outputText.data += line + "\n";
    }
    
    function loopThroughClosest()
    {
        var deferred = $.Deferred();
        
        var i = 0;
        var nextStep = function() {
            if (i < _closest.length) {
                var promise = Route(_closest[i]);
                promise.then(function(result) { 
                    printOutput("Result loop for "+ _closest[i] +": " + result);
    	            i++;
	                setTimeout(nextStep, 500); 
                });
            }
            else {
                deferred.resolve("done");
            }
        }
        nextStep();
        return deferred.promise();
    }
    
    function Route(dataIn)
    {
        var deferred = $.Deferred();
        
        var i = 0;
        var nextStep = function() {
            if (i<1) {
                var tir = Math.floor(Math.random() * 600) + 100;
                var inO = {data: "Step "+ dataIn + ": " + i, timer: tir};
                console.log(inO);
                _routes.push(inO);
                i++;
                setTimeout(nextStep, tir); 
            }
            else {
                deferred.resolve("done");
            }
        }
        nextStep();
        return deferred.promise();
    }
    
    function addToFoundList()
    {
        var promise = loopThroughClosest();
        promise.then(function(result) { 
            printOutput("FINAL:");
            console.log(_routes);
            $.each(_routes, function(k, v){
            	printOutput(k + v.data);
            });
        });
    }
    
     addToFoundList();
    
})();