我正在尝试学习如何将诺言用于数组和一些异步mongo查询。这是我目前拥有的方法,但是Q.allSettled在我的mongo查询b / c之前执行,但是Q.allSettled所查看的内容都没有被推送到数组。

如何修改此方法,以便在Q.allSettled.spread执行之前执行所有异步查询?

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;
      }

最佳答案

两件事情:

Q.allSettled仅捕获调用时数组中的promise。
您将需要等待,直到您填充了阵列为止,也许可以保证完成上述each调用。

另一个是Q.defer()返回一个{promise, resolve}对。您只需要将promise添加到promises数组。

promises.push(def.promise);

关于javascript - Q.allSettled在将任何内容推送到数组之前执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25674534/

10-11 08:10
查看更多