【问题标题】:deferred.resolve() is not iterating the last element inside a forloopdeferred.resolve() 没有迭代 for 循环中的最后一个元素
【发布时间】:2016-11-20 09:53:15
【问题描述】:

在 model.findone 中,我得到一个由 3 个元素组成的数组。在 else 部分,我循环遍历每个项目并获取该特定项目的提供头。

但我只能获得 2 个供品头。无法获取最后一个供品头。 我的代码有问题吗??

function getOfferingsHeads(id) {
    var deferred = Q.defer();
    var offeringHeads = [];
    model
    .findOne({ _id: id })
    .exec(function (err, item) {
        if(err) {
            console.log(err);
            deferred.reject(err);
        }
        else {
            // deferred.resolve(item.offerings);
            // var offeringsList = [];
            // offeringsList = item.offerings;

            for (var i = 0; i < item.offerings.length; i++) {
                executivesModel
                .findOne({offName: item.offerings[i] })
                .exec(function(err1, item1) {
                    if(err1){
                        console.log(err1);
                        deferred.reject(err1);
                    }
                    else{
                        offeringHeads.push(item1.offHead);
                        deferred.resolve(offeringHeads);
                    }
                });
            }
        }
    });
    return deferred.promise;
}

【问题讨论】:

    标签: angularjs mongoose mean-stack q


    【解决方案1】:

    您不能多次解决 deferred,而且通常您根本不应该使用 deferred。由于 mongoose 有一个承诺友好的 API,你应该只使用它。它会让你的代码更加简洁:

    function getOfferingHead(offName) {
        return executivesModel
            .findOne({offName: offName })
            .exec()
            .then(function (item) {
                return item.offHead;
            });
    }
    
    function getOfferingsHeads(id) {
        return model
            .findOne({ _id: id })
            .exec()
            .then(function (item) {
                return Q.all(item.offerings.map(getOfferingHead));
            });
    }
    

    使用功能:

    getOfferingsHeads('myId').then(function (heads) {
        console.log(heads);
    });
    

    【讨论】:

      【解决方案2】:

      不确定这是您的意图,但您不止一次解决同一个承诺。

      最新版本的 mongoose 允许您设置要使用的 Promise 库。

      以下是对我认为您的意图的更正:

      //Somewhere near mongoose definition
      mongoose.Promise = require('q').Promise;
      
      function getOfferingsHeads(id) {
       var offeringHeads = [];
       return model
       .findOne({ _id: id })
       .then(function (item) {
          if(!item) {
           //Handle no results
           return Q.reject()
          }
          else {
              return Q.all(item.offerings.map(function(offering){
               executivesModel
                  .findOne({offName: offering.name})
              }));
          }
       });
      }
      
      //Now you can use
      getOfferingsHeads('someId').then(function (offerings) {
       ...
      });
      

      【讨论】:

        猜你喜欢
        • 2016-05-26
        • 2011-07-11
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多