2013-01-27 2 views
3

Так вот мы некоторые приложения на основе CompoundJS рамок и некоторый контроллер на нем:Каков правильный способ вызова «render» после всех асинхронных исполнений в контроллере?

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 */ }); 
}); 

Возникает вопрос: как сделать шаблон index после окончания всех обратных вызовов?

Возможно, есть что-то вроде jQuery's $.when, описанного в this answer?

ответ

2

Понятно, что вам просто нужно отслеживать количество асинхронных вызовов, которые вы ожидаете, что я проиллюстрировал в вашем коде ниже. Но есть множество небольших библиотек, которые делают это намного более общим, элегантным и дают вам больше контроля (например, убедитесь, что они работают в последовательности и подобных материалах). async.js, например.


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 

}); 
+1

Я уверен, что вы хотите иметь предредукцию в строке 'if (asyncCounter--> 0)'. В противном случае 'render' никогда не будет вызываться (если вы не используете вводящее в заблуждение начальное значение для' asyncCounter'). –

+0

Вы правы. Исправлено. –