fixing async for loops properly

This commit is contained in:
2013-01-08 22:34:35 -05:00
parent 47f005d5bf
commit 6b6b87c482
4 changed files with 77 additions and 330 deletions

View File

@@ -15,84 +15,33 @@
<link rel="stylesheet" href="/static/stylesheets/smoothness/jquery-ui-1.8.20.custom.css"/>
<link rel="stylesheet" href="/static/stylesheets/jui_style.css"/>
<link rel="stylesheet" href="/static/stylesheets/style.css"/>
<script id="movieTemplate1" type="text/x-jsrender">
<h3>{{:Activities.Activity.date}}</h3>
<div class="workoutdata">
<a href=# class="activitydelete" title="{{:_id}}" >Delete</a>
<a href=# class="activityedit" title="{{:_id}}" >Edit</a>
{{if Activities.Activity.Lap}}
{{for Activities.Activity.Lap}}
<p>Workout step {{:#index+1}} -
{{if cardio}} Cardio - {{:cardio.name}} - {{:cardio.distance}} x {{:cardio.time}} -- {{:cardio.muscledata}} {{/if}}
{{if exercise}} Exercise - {{:exercise.name}} - {{:exercise.sets}} x {{:exercise.reps}} with {{:exercise.weight}} Kg -- {{:exercise.muscledata}}{{/if}}
{{if rest}} Recovery Step {{/if}}
</p>
{{/for}}
{{/if}}
</div>
</script>
<script id="DataTemplate1" type="text/x-jsrender">
<h3>{{:Activities.Activity.date}}</h3>
<div class="workoutdata">
// <h4>{{:Activities.Activity.date}} - {{:Activities.Activity.name}}</h4>
<a href=# class="activitydelete" title="{{:_id}}" >Delete</a>
<a href=# class="activityedit" title="{{:_id}}" >Edit</a>
</div>
</script>
</head>
<body>
<div id="container">
<div id="logo"><H1>BodyREP Demo ADMIN</h1></div>
<div id="display">
<ul>
<li style="display: none" class="new-lap ui-state-default removable">
<label class="uiindex"></label>
<select class="laptype" >
<option value="">Select...</option>
<option value="Cardio">Cardio</option>
<option value="Exercise">Weights</option>
</select>
<span><a href=# class=delete>delete</a></span>
</li>
</ul>
<button type="button" id="addexerciseformopen" value="AddExercise"/>Add New Exercise</button>
<div id="ExerciseEditor" >
<span class="EditExerciseID">
<ul id="exercises">
</ul>
<span class="EditExerciseID">
<ul id="exercises">
</ul>
</span>
</div>
<div id="ExerciseEditorForm" >
<span class="EditExerciseID">
<span class="EditExerciseID">
<form id="EditExerciseForm">
<ul id="editexercise">
</ul>
<ul id="editexercise">
</ul>
<button type="submit" id="saveexercises" value="Save">Save</button>
<button type="button" id="cancelexerciseform" value="Cancel"/>Reset</button>
</form>
</span>
</form>
</span>
</div>
</div>
</div>
</div>
</div>
</div></body>
</html>

132
app.js
View File

@@ -12,20 +12,15 @@ var db = mongo.db('localhost:27017/test');
var testcollection = db.collection('testcollection');
var exercisecollection = db.collection('exercisecollection');
var util = require('util');
//var parser = new xml2js.Parser();
var waiting = 0;
var waitingj = 0;
//var extname;
var app = require('http').createServer(function handler(request, response) {
var extname;
console.log('request starting...;' + request.url);
switch(request.url) {
case '/admin':
//var filePath = '.' + request.url;
//if (filePath == './')
filePath = './admin.html';
extname = path.extname(filePath);
@@ -118,107 +113,42 @@ io.sockets.on('connection', function(socket) {
///////////////////////////////////////////
socket.on('getactivites', function(data) {
console.log('getactivities');
waiting = 0;
waitingj = 0;
testcollection.find().toArray(function(err, result) {
if (err) throw err;
for (var j in result) {
console.log('getactivities' + JSON.stringify(result));
var eresult = result;
var i;
waitingj ++;
async.forEach(j, function(item,callback) {
console.log('iteration ' + item);
console.log('in async' + JSON.stringify(result[item]));
result[item]._IDcopy = result[item]._id;
}, function(err){
// if any of the saves produced an error, err would equal that error
});
for(i in result[j].Activities.Activity.Lap) {
//////////////
waiting ++;
getbyidall(eresult,result[j].Activities.Activity.Lap[i].selection,i,j);
////////////////////
console.log('below_i = ' + i);
//console.log('DATA = ' + JSON.stringify(callback));
}
}
async.forEachSeries(result,
function(item,callback2) {
async.forEachSeries(item.Activities.Activity.Lap,
function(itemx,callback3){
exercisecollection.findById(itemx.selection, function(err, exresult) {
if (err) throw err;
itemx.exercisename = exresult.exercise.name;
itemx.exercisemuscledata = exresult.exercise.muscledata;
itemx.exerciseclass = exresult.exercise.type;
callback3();
});
}, function(err){
callback2();
});
}, function(err){
socket.emit('populateactivities', result);
});
});
});
////////////////////////////////////////
function deiteratej() {
if (!waiting) {
waitingj --;
}
}
function completeall(result) {
if (!waiting) {
console.log('done');
socket.emit('populateactivities', result);
}
}
function complete(result) {
if (!waiting) {
console.log('done');
socket.emit('populateactivitybyid', result);
}
}
function getbyidall (result,docid,iteration,iterationtop){
exercisecollection.findById(docid, function(err, exresult) {
if (err) throw err;
waiting --;
console.log('waiting = ' + waiting);
console.log('inside_j = ' + iterationtop);
console.log('inside_i = ' + iteration);
result[iterationtop].Activities.Activity.Lap[iteration].exercisename = exresult.exercise.name;
result[iterationtop].Activities.Activity.Lap[iteration].exercisemuscledata = exresult.exercise.muscledata;
result[iterationtop].Activities.Activity.Lap[iteration].exerciseclass = exresult.exercise.type;
deiteratej();
completeall(result);
});
}
function getbyid (result,docid,iteration){
exercisecollection.findById(docid, function(err, exresult) {
if (err) throw err;
waiting --;
console.log('waiting = ' + waiting);
console.log('inside_i = ' + iteration);
result.Activities.Activity.Lap[iteration].exercisename = exresult.exercise.name;
result.Activities.Activity.Lap[iteration].exercisemuscledata = exresult.exercise.muscledata;
result.Activities.Activity.Lap[iteration].exerciseclass = exresult.exercise.type;
complete(result);
});
}
});
///////////////////////////////////////
socket.on('getactivitybyid', function(id) {
waiting = 0;
socket.on('getactivitybyid', function(id) {
testcollection.findById(id, function(err, result) {
if (err) throw err;
//console.log('Activity result = ' + JSON.stringify(result));
//var unpackedresult = JSON.parse(result);
var eresult = result;
var i;
for(i in result.Activities.Activity.Lap) {
//console.log('Activity parse result = ' + JSON.stringify(item.val1));
console.log('above_i = ' + i);
///////////////
waiting ++;
getbyid(eresult,result.Activities.Activity.Lap[i].selection,i);
////////////////////
console.log('below_i = ' + i);
//console.log('DATA = ' + JSON.stringify(callback));
}
async.forEachSeries(item.Activities.Activity.Lap,
function(itemx,callback3){
exercisecollection.findById(itemx.selection, function(err, exresult) {
if (err) throw err;
itemx.exercisename = exresult.exercise.name;
itemx.exercisemuscledata = exresult.exercise.muscledata;
itemx.exerciseclass = exresult.exercise.type;
callback3();
});
}, function(err){callback2();});
});
});

View File

@@ -35,7 +35,6 @@
<script id="DataTemplate1" type="text/x-jsrender">
<h3>{{:Activities.Activity.date}}</h3>
<div class="workoutdata">
// <h4>{{:Activities.Activity.date}} - {{:Activities.Activity.name}}</h4>
<a href=# class="activitydelete" title="{{:_id}}" >Delete</a>
<a href=# class="activityedit" title="{{:_id}}" >Edit</a>
</div>

View File

@@ -1,12 +1,14 @@
$(document).ready(function() {
//makes buttons buttons
$("button").button();
var socket = io.connect();
socket.emit('getexercises', 'please');
$("#ExerciseEditorForm").dialog({ autoOpen: false });
$( "#ExerciseEditorForm" ).dialog( "option", "minHeight", 330 );
$( "#ExerciseEditorForm" ).dialog( "option", "minWidth", 630 );
$( "#ExerciseEditorForm" ).dialog({ buttons: [
$("#ExerciseEditorForm").dialog( "option", "minHeight", 330 );
$("#ExerciseEditorForm").dialog( "option", "minWidth", 630 );
$("#ExerciseEditorForm").dialog({ buttons: [
{
text: "Close/Cancel",
click: function() {
@@ -24,116 +26,38 @@ $(document).ready(function() {
$('span.EditExerciseID').removeAttr('docid');
var newElem = $('<li><label>Name</label><input type="text" name="exercise.name" value=""></li>');
newElem.append('<li><label>exercise.type</label><select name="exercise.type" ><option value="">Select...</option><option value="Cardio">Cardio</option><option value="Exercise">Weights</option></select></li>');
// newElem.append('<li><label>exercise.type</label><input type="text" name="exercise.type" value=""></li>');
newElem.append('<li><label>Muscle Data Array</label><input type="text" name="exercise.muscledata" value=""></li>');
$(newElem).appendTo('#editexercise');
$("#ExerciseEditorForm").dialog("open");
});
//makes datepickers
// $( "#datepicker" ).datepicker();
// $('#Activity').find('input.datepicker').datepicker();
// $('#Activity').find('input.datepicker').datepicker('setDate', new Date());
var socket = io.connect();
//exercise_autocompletedata = "unset";
//bike_autocompletedata = "unset";
//socket.emit('getactivites', 'please');
socket.emit('getexercises', 'please');
//socket.emit('getexerciselist', 'cardio');
//socket.emit('getexerciselist', 'weights');
// socket.on('populateactivities', function(json) {
// console.log('#poulate recieved');
// var content = "";
// $(".workoutdata").hide();
// $('#ActivityList').empty();
// $( "#ActivityList" ).html(
// $( "#movieTemplate1" ).render( json )
// );
// $(".ui-accordion-content").css("display", "block");
// // $("#ActivityList").accordion('destroy').accordion({
// // header: 'h3',
// // active: false,
// // collapsible: true
// // });
// });
//poulate activity by id
socket.on('populateexercisebyid', function(array) {
// clear it first
socket.on('populateexercisebyid', function(array) {
$('ul#editexercise li').remove();
$('span.EditExerciseID').removeAttr('docid');
//set document id
$('span.EditExerciseID').attr('docid',array._id);
console.log('name= ' + array.exercise.name);
console.log('class= ' + array.exercise.type);
console.log('muscledata= ' + array.exercise.muscledata);
var newElem = $('<li><input type="text" name="exercise.name" value="'+ array.exercise.name + '"><input type="text" name="exercise.type" value="'+ array.exercise.type + '"><input type="text" name="exercise.muscledata" value="'+ array.exercise.muscledata + '"></li>');
$(newElem).appendTo('#editexercise');
console.log('name= ' + array.exercise.name);
console.log('class= ' + array.exercise.type);
console.log('muscledata= ' + array.exercise.muscledata);
var newElem = $('<li><input type="text" name="exercise.name" value="'+ array.exercise.name + '"><input type="text" name="exercise.type" value="'+ array.exercise.type + '"><input type="text" name="exercise.muscledata" value="'+ array.exercise.muscledata + '"></li>');
$(newElem).appendTo('#editexercise');
});
////populate exercise tables
socket.on('populateexercises', function(json) {
var content = "";
$('ul#exercises li').remove();
///// for loop
var array = json;
exercise_autocompletedata = array;
$.each(json, function(index, array) {
$( "ul#exercises" ).append('<li><label>Exercise Name</label> '+ array.exercise.name + '<label>Exercise Name</label>'+ array.exercise.type + '<label>Muscle Data</label>'+ array.exercise.muscledata + '<a href=# class="exercisedelete" title="' + array._id +'" >Delete</a><a href=# class="exerciseedit" title="' + array._id +'" >Edit</a></li>');
})
;
socket.on('populateexercises', function(json) {
var content = "";
$('ul#exercises li').remove();
var array = json;
exercise_autocompletedata = array;
$.each(json, function(index, array) {
$( "ul#exercises" ).append('<li><label>Exercise Name</label> '+ array.exercise.name + '<label>Exercise Name</label>'+ array.exercise.type + '<label>Muscle Data</label>'+ array.exercise.muscledata + '<a href=# class="exercisedelete" title="' + array._id +'" >Delete</a><a href=# class="exerciseedit" title="' + array._id +'" >Edit</a></li>');
})
;
});
// //THe Sortable Stuff
// $("#sortable").sortable({
// placeholder: "ui-state-highlight",
// revert: true,
// stop: function(event, ui) {
// $('#sortable').trigger('sortupdate');
// }
// });
// $("#sortable").bind('sortupdate', function(event, ui) {
// $('#sortable li').each(function(){
// var itemindex= $(this).index();
// $(this).children('label.uiindex').html('Exercise '+ itemindex );
// $(this).find('input, select').not('.laptype').each(function(){
// var newname = $(this).attr('name').replace(/\[[0-9]*\]/,'[' + itemindex + ']');
// $(this).attr("name",newname);
// });
// $(this).find('input.exertags').autocomplete({source: exercise_autocompletedata});
// });
// });
// $("#sortableexercises").bind('sortupdate', function(event, ui) {
// $('#sortableexercises li').each(function(){
// var itemindex= $(this).index();
// $(this).find('input, select').each(function(){
// var newname = $(this).attr('name').replace(/\[[0-9]*\]/,'[' + itemindex + ']');
// $(this).attr("name",newname);
// });
// });
// });
// $('#ActivityList').delegate('a.activitydelete', 'click', function() {
// socket.emit('delactivity', $(this).attr('title'));
// return false;
// });
// $('#ActivityList').delegate('a.activityedit', 'click', function() {
// socket.emit('getactivitybyid', $(this).attr('title'));
// $("#Activity").dialog("open");
// return false;
// });
$('#exercises').delegate('a.exercisedelete', 'click', function() {
console.log("exercisedelete_click");
@@ -150,83 +74,28 @@ $(document).ready(function() {
// $('ul').on('click', '.delete',function() {
// $(this).closest('li').remove();
// $('#sortable').trigger('sortupdate');
// });
//adds selectable element
// $("button").click(function() {
// var addtype = $(this).attr('value');
// var newElem = $('.new-' + addtype).clone(true).attr('style', 'display: block');
// $(newElem).removeClass("new-" + addtype);
// $(newElem).children('input').attr('disabled',false);
// $(newElem).appendTo('#sortable');
// $(newElem).sortable( "refresh" );
// //$('#sortable').trigger('sortupdate');
// //$('#sortableexercises').trigger('sortupdate');
// });
// $("button.AddExercise").click(function() {
// $( "ul#sortableexercises" ).append('<li class=ui-state-default><input type="text" name="exercise[].name" hint="Name" placeholder="Exercise Name"><input type="text" name="exercise[].class" placeholder="cardio or weights"><input class="addexercisemusclearray" type="text" name="exercise[].muscledata" hint="Muscle Array" placeholder="Muscle Array"><a href=# class=delete>delete</a></li>')
// $('#sortableexercises').trigger('sortupdate');
// });
// $('#save').click(function() {
// var docid =$(this).closest('span').attr('docid');
// var selector= "#myForm"
// var formDataAll = $(selector).toObject({mode: 'all'});
// socket.emit('addactivity', formDataAll[0], docid);
// $('ul#sortable li').remove('.removable');
// $('#Activity').find('input').attr('value','');
// $('span.ActivityID').removeAttr('docid');
// $('#Activity').find('input.datepicker').datepicker();
// $('#Activity').find('input.datepicker').datepicker('setDate', new Date());
// socket.emit('getactivites', 'please');
// socket.emit('getexercises', 'please');
// return false;
// });
$('#saveexercises').click(function() {
console.log("saving exercise");
var docid =$(this).closest('span').attr('docid');
var selector= "#EditExerciseForm";
var formDataAll = $(selector).toObject({mode: 'all'});
socket.emit('updateexercises', formDataAll[0], docid);
//cleanup[]
$('#editexercise li').children('input').attr('value','');
$('#editexercise li').children('select').attr('value','');
$('span.EditExerciseID').removeAttr('docid');
socket.emit('getexercises', 'please');
//$('ul#newexercises').find('input').attr('value','');
//$('ul#newexercises').find('select').attr('selected','');
//socket.emit('getactivites', 'please');
return false;
$('#saveexercises').click(function() {
console.log("saving exercise");
var docid =$(this).closest('span').attr('docid');
var selector= "#EditExerciseForm";
var formDataAll = $(selector).toObject({mode: 'all'});
socket.emit('updateexercises', formDataAll[0], docid);
//cleanup[]
$('#editexercise li').children('input').attr('value','');
$('#editexercise li').children('select').attr('value','');
$('span.EditExerciseID').removeAttr('docid');
socket.emit('getexercises', 'please');
return false;
});
// $('#cancelform').click(function() {
// $('ul#sortable li').remove('.removable');
// $('span.ActivityID').removeAttr('docid');
// $('#Activity').find('input').attr('value','');
// $('#Activity').find('input.datepicker').datepicker();
// $('#Activity').find('input.datepicker').datepicker('setDate', new Date());
// socket.emit('getactivites', 'please');
// socket.emit('getexercises', 'please');
// return false;
// });
$('#cancelexerciseform').click(function(){
//$('ul#editexercise li').remove();
$('#editexercise li').children('input').attr('value','');
$('span.EditExerciseID').removeAttr('docid');
socket.emit('getexercises', 'please');
//return false;
});
$('#editexercise li').children('input').attr('value','');
$('span.EditExerciseID').removeAttr('docid');
socket.emit('getexercises', 'please');
return false;
});
//document closing
});