jQuery deferred

HTML

<ul id="progress">
</ul>

JavaScript

// This exersices the solution to this stackoverflow question: 
// http://stackoverflow.com/questions/6647527/jquery-deferred-do-i-need-pipes-or-chains-to-achieve-this-pattern


logProgress('loaded');

main();

function main(){
    
    logProgress('in main');
    
    var data = []; // the ids coming back from serviceA

    var deferredA = callToServiceA(data); // has to add the ids to data

    deferredA.done(function() { // if callToServiceA successful...
        var deferredBs = [];

        for(var i = 0; i < data.length; i++){
            deferredBs.push(callToServiceB(data[i]));
        }

        $.when.apply($, deferredBs).then(callToServiceC); 
    });
}        
        
function callToServiceA(data){

        var dfd = $.Deferred();
        
        logProgress('calling service A');
        data.push(3);
        data.push(7);        
    
        setTimeout(dfd.resolve(),1000);
    
        return dfd.promise();
}

function callToServiceB(data){

        var dfd = $.Deferred();
        
        logProgress('calling service B');
    
        var key = 'data'+data;
        var value = data*10;
        logProgress('writing: '+key+','+value);
        $.data(document.body, key, value);    
    
        setTimeout(dfd.resolve(), 2000);    
    
        return dfd.promise();
}

function callToServiceC(){
        
        logProgress('calling service C');
        logProgress('extracting info that was created by serviceB calls');
        logProgress($.data(document.body, 'data3'));
        logProgress($.data(document.body, 'data7'));        
}

function logProgress(message){
    $('#progress').append('<li>'+message+'</li>');
}