3

So here we have some application based on CompoundJS framework and some controller on it:

load('application');

action('index', function () {
    someMethodWithAsyncCallback({}, function () {
        /* async preparing some params for template */
    });

    anotherMethodWithAsyncCallback({}, function () {
        /* async preparing another params for template */
    });

    // another couple of async calls

    // rendering index template
    render('index', { /* using async params */ });
});

The question is: how to render template index after the end of all callbacks?

Maybe there is something like jQuery's $.when described in this answer?

Community
  • 1
  • 1
FelikZ
  • 2,976
  • 4
  • 32
  • 41

1 Answers1

2

Conceptually, you just need to keep track of the number of async calls returning you are waiting for, which I've illustrated in your code below. But there are loads of little libraries that make this a lot more generic, elegant and give you more control (like making sure they run in sequence and similar stuff). async.js for instance.


load('application');

action('index', function () {

    var asyncCounter = 2; // Or whatever number of async you want to complete...
    var completeFunc = function() {
        if (--asyncCounter > 0) {
            return;
        }
        // rendering index template
        render('index', { /* using async params */ });
    };

    someMethodWithAsyncCallback({}, function () {
        /* async preparing some params for template */
        completeFunc();
    });

    anotherMethodWithAsyncCallback({}, function () {
        /* async preparing another params for template */
        completeFunc();
    });

    // another couple of async calls

});
Marius Kjeldahl
  • 6,830
  • 3
  • 33
  • 37
  • 1
    I'm pretty sure you want a pre-decrement in the line `if (asyncCounter-- > 0)`. Otherwise `render` will never be called (unless you use a misleading initial value for `asyncCounter`). – Aaron Dufour Jan 30 '13 at 19:44