Ответ, который я придумал, такой:
var count = 0;
// Number of functions that need to run. This can be dynamically generated
// In this case I call check(data, cb) a total of 3 times
var functionNum = 3;
function toCallAfter(){
console.log('I am a delayed function');
}
У меня было это для функции проверки, которая запускалась один раз регулярно и дважды в цикле:
check(data, function(err){ // check is my asynchronous function to check data integrity
if (err){
return cb(null, { // cb() is the return function for the containing function
errCode: 'MISSINGINFO',
statusCode: 403,
message : 'All mandatory fields must be filled in'
});
} // This part here is an implicit else
count++; // Increment count each time required functions complete to
// keep track of how many function have completed
if (count === functionNum) {
return anon();
}
return;
});
// Run twice more in a loop
for(var i = 0; i < 2; i++) {
check(data, function(err) { // calls check again in a loop
if (err){
return cb(null, {
errCode: 'MISSINGINFO',
statusCode: 403,
message : 'All mandatory fields must be filled in'
});
}
count++;
if (count === functionNum) {
return toCallAfter();
}
return;
});
}
Наконец, я хотел бы указать на существенную ошибку производительности в альтернативном (и чрезвычайно распространенном) ответе:
(function wait() {
if ( chatroom.json ) {
chatroom.render();
} else {
setTimeout( wait, 500 );
}
})();
В этом случае вы, по сути, держите браузер или сервер (если используете node.js) заложниками в течение 500 миллисекунд для каждой проверки, что невероятно долго для компьютера. Это огромный удар по производительности. Мое решение по непосредственному отслеживанию требуемых завершенных функций не требует временных ограничений и будет работать сразу же после завершения всех функций.