Я не знаю coffeescript, но чтобы сделать это в js, вы можете использовать замыкание:
var total_trend = (function() {
var total = 0,
num_adds = 0;
return {
add_to_total: function(add) { total += parseInt(add, 10); num_adds += 1; },
get_total: function() { return total; },
get_deferred_total: function(expected, callback) {
if(num_adds !== expected) {
var _this = this;
setTimeout(function(){ return _this.get_deferred_total(expected, callback); }, 100);
} else {
callback(total);
}
}
};
})();
Определите это как переменную, к которой может обращаться ваш обратный вызов, затем в обратном вызове ajax выполните:
total_trend.add_to_total(data.response.total);
и когда вы хотите всего:
total_trend.get_total();
и если вы хотите отложить итоговое значение до тех пор, пока add_to_total не получит заданное количество вызовов:
var expected_num_calls = 5;
total_trend.get_deferred_total(expected_num_calls, function(total) { alert(total); } )
В приведенном выше случае функция обратного вызова будет вызываться, когда add_to_total был вызван 5 раз.
РЕДАКТИРОВАТЬ: Как указал Феликс, оригинальная версия не поддерживала ожидание, пока вызовы Ajax не были сделаны. Код был обновлен для поддержки отсрочки итога. Это должно сработать, но ответ Феликса, вероятно, немного чище в этот момент.