I'm trying to learn how to use promises with arrays and some async mongo queries. Here's the method that I currently have, but Q.allSettled executes before my mongo queries b/c nothing has been pushed to the array yet that Q.allSettled is looking at.
How can I modify this method so that all my async queries are executed before Q.allSettled.spread executes?
function buildCaseObject() {
        var returnPromise = Q.defer();
        var promises = [];
        var allObjects = [];
        var subjects = rdb.collection('subjects');
        var observations = rdb.collection('observation');
        // Loop through all subjects from current subject list
        subjects.find({'player._id': {$elemMatch: {root: '1.2.3.99.100.2', extension: {$in : subjectList}}}}).each(function(err, subject) {
          var def = Q.defer();
          promises.push(def);
          if (err) {
            def.reject(err);
          } else if (subject== null) {
            return def.resolve();
          }
          var caseObject = {};
          caseObject.subject= clone(subject);
          // Add observations to the subject
          observations.find({subjectId: subject._id}).toArray(function(err, allObs) {
            if (err) {
              def.reject(err);
            }
            caseObject.observations = clone(allObs);
            allObjects.push(caseObject);
            def.resolve();
          });
        });
        Q.allSettled(promises).then(function() {
          // GETTING IN HERE BEFORE GETTING INTO THE CALLBACK OF subjects.find.
          // THEREFORE THE ARRAY IS EMPTY
          console.log('in spread');
          console.log(allObjects.length);
          returnPromise.resolve(allObjects);
        }).fail(function(err) {
          returnPromise.reject(err);
        });
        return returnPromise.promise;
      }
 
    