0

I have an array of posts called top thread, and I am trying to retrieve an array of arrays, each array containing all the replies to a single post in the original array sans the best one. here is my code for getting the top thread

exports.topThread = function(req, res){
// gets the leaf id from URL and assigns to OPID
var OPID = req.params.id;
var thread = [];
// finds the post with id OPID from the db
titles.findOne({postID: OPID}, function (err, post) {
if (err) throw err; 
getBestThread(OPID, thread, function(result){
 branchList.getBranches(function(branches){
 // renders content with data retrieved from the post
 res.render('content', {title: post.title, content: post.body, OPID: post.postID, currentThread: result, branches: branches});
 console.log(result);
 });
 });
});

};

this part of the code works: result is an array of the posts I want. Now I want to pass each element of the result array into my getAllOtherReplies function

//calback to retrieve other replies for a parent comment
 getOtherReplies = function(parentID, callback){
 postdb.otherReplies(parentID, function(err, commentsArray){
 if (err) throw err;
 callback(commentsArray);
 })
 }
 getAllOtherReplies = function(threadArray, returnArray, callback) {
 async.each(threadArray, 
 function(value, callback) {
 getOtherReplies(value.commentID, function(commentsArray) {
 console.log(value.commentID);
 if (commentsArray)
 returnArray.push(commentsArray);
 });
 callback();
 },
 function(err) {
 if (err) throw err;
 }
 );
 callback(returnArray);
 }

and here is the function in postsDB:

//retrieves other replies from db
 exports.otherReplies = function(parentID, callback){
 titles.find({type: "comment", parentID: parentID}).sort({hotness: -1}).toArray(function(err, result){
 if (err) throw err;
 if (result.length > 1)
 callback(result.splice(0,1));
 else callback(null);
 });
 };

now I try to modify my original code to call the getAllOtherReplies function:

 exports.topThread = function(req, res){
 // gets the leaf id from URL and assigns to OPID
 var OPID = req.params.id;
 var thread = [];
 var allOtherReplies = [];
 // finds the post with id OPID from the db
 titles.findOne({postID: OPID}, function (err, post) {
 if (err) throw err; 
 getBestThread(OPID, thread, function(result){
 getAllOtherReplies(result, allOtherReplies, function(returnArray){
 console.log(returnArray);
 branchList.getBranches(function(branches){
 // renders content with data retrieved from the post
 res.render('content', {title: post.title, content: post.body, OPID: post.postID, currentThread: result, branches: branches});
 console.log(result);
 });
 });
 });
 });
 };

and instead of returning an array of arrays of all replies for each comment in result, it return an array of arrays where each array is the replies to only the first comment in result, repeated n times where n is the number of posts in result. I know there is an async problem I'm missing, any help would be appreciated.

asked Feb 18, 2013 at 18:53

1 Answer 1

1

Inside your async.each loop, getOtherReplies is adding commentsArray inside of a callback, yet you are calling the async callback immediately after getOtherReplies and not waiting for it's callback.

Moving the async callback into getOtherReplies would be a good start and might very well solve the problem.

getOtherReplies(value.commentID, function(commentsArray) {
 console.log(value.commentID);
 if (commentsArray) {
 returnArray.push(commentsArray);
 }
 callback();
 });
answered Feb 18, 2013 at 21:28
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.