-->

Async node.js data flow confusion

2019-08-08 16:50发布

问题:

thanks for your help...struggling big time with how to handle this properly. I'm in async now, having given up on my ability to write the callbacks properly. I have snippet where I'm passing a set of random numbers (eachrecord) and passing them through to a mongoose call. Trying to create a data set from the multiple queries I pass.

My issue is that no matter what I've done for 4 hours, the "newarray" variable is always empty.

Thank you for your help -

async.forEach(arLimit, function(eachrecord, callback){

  newarray = new Array;

  var query = UGC_DB_Model.find({}).skip(eachrecord).limit(-1);

  query.execFind(function (err, data) {
    if (err)
      console.log(err);
    else {
      newarray.push(data);
    }
  });

   callback(null, newarray);

}, function(err, result) {
  if (err) return next(err);
      console.log("(it's empty): " + result); 
}); 

回答1:

There are several issues with your code:

  • async.forEach isn't meant to 'generate' results, that's what async.map is for;
  • you need to call the callback only when execFind is done, and not immediately after calling it;
  • your newarray is probably not necessary;

So try this instead:

async.map(arLimit, function(eachrecord, callback){

  var query = UGC_DB_Model.find({}).skip(eachrecord).limit(-1);

  query.execFind(function (err, data) {
    if (err)
      callback(err); // pass error along
    else {
      callback(null, [ data ]);
      // although I think you mean this (because 'data' is probably an array already)
      //   callback(null, data);
    }
  });

}, function(err, result) {
  if (err) return next(err);
  console.log("(it's empty): " + result); 
});