Running asynchronous tasks

Performing multiple ajax tasks asynchronously

by totszwai

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-mockjax/1.5.3/jquery.mockjax.min.js"></script>

JavaScript

$.mockjax({ url: '/test1', responseTime: 1000, responseText: "hello 1" }); 
$.mockjax({ url: '/test2', responseTime: 3000, responseText: "hello 2" }); 
$.mockjax({ url: '/test3', responseTime: 2000, responseText: "hello 3" }); 

var jobs = [
    function() {
        console.log("running task 1");
        return $.get('/test1').done(function(response) {
            console.log("task 1:" + response);
        });
        
    },
    function() {
        console.log("running task 2");
        return $.get('/test2').done(function(response) {
            console.log("task 2:" + response);   
        });
        
    },
    function() {
        console.log("running task 3");
        return $.get('/test3').done(function(response) {
            console.log("task 3:" + response);   
        });
    }
];

processTasksAsynchronously(jobs, { a : 2 }); 


function processTasksAsynchronously(tasks, object, ctx) {

    if (!tasks || !tasks.length) return $.Deferred().resolve(object).promise();
    var first = tasks[0];
    var rest = tasks.slice(1);
    var result = first.call(ctx, object);
    if (result && _.isFunction(result.then)) {
        return result.then(function () {
            return processTasksAsynchronously(rest, object, ctx);
        });
    } else {
        return processTasksAsynchronously(rest, object, ctx);
    }
}