Node.js Chaining承诺使用q.js

时间:2016-07-04 10:25:23

标签: node.js mongodb promise q

我使用带有mongodb的node.js和用于promises的q.js.

以下是我的mongodb架构:

{
  UserId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
  FirstName: String,
  LastName: String,
  Gender: String,
  userDocument: [userDocumentSchema],
  userEducation: [userEducationDetailsSchema]
};
var userEducationDetailsSchema = new Schema({
  DegreeName: String,
  University: String,
});
var userDocumentSchema = new mongoose.Schema({
  DocumentName: String,
  DocumentPath: String
});


I have following function by chaining promises:

var updateUserDetails = function (req, res) {
  var finalResult = [];
  /* This is the function to update user using promise.*/
  updateUserBasicDetails(req).then(function (req) {
    _.each(req.body.userEducation, function (sd) {
      return getEducationDetail(req.body._id, sd) /* this fun finds if education details are present or not by iterating usertEducation Array */
        .then(function (result) {
          if (result) {
            /* if education details exist then this will update the details */
            return updateEducationDetails(sd, req.body._id).then(
              function (result) {
                return result;
              })
          } else {
            /*else add the education details*/
            return addEducationDetails(sd, req.body._id).then(
              function (result) {
                return result;
              })
          }
        }).then(function (result) {
          finalResult.push(result);
        })
    })
    return JSON.stringify(finalResult);
  }).then(function (finalResult) {
    res.json({
      "token": finalResult /*but here m getting empty result */
    })
  }).catch(console.log).done();
}

我的查询是:

  1. 这是实施承诺的正确方法吗?
  2. 在最后一个链中,我得到空的结果,但是当我打印o / p到控制台时,我得到了正确的结果。
  3. 我完成了getEducationDetail函数迭代的方式,是正确的方式还是有其他选择。如果是这样我怎么能达到同样的目的。

1 个答案:

答案 0 :(得分:0)

你的代码可以更干净,请调整一些这样的部分

var updateUserDetails = function (req, res) {
  var finalResult = [];
  /* This is the function to update user using promise.*/
  return updateUserBasicDetails(req)
    .then(function (req) {
      _.each(req.body.userEducation, function (sd) {
        return getEducationDetail(req.body._id, sd)
          .then(function (result) {
            if (result) {
              return updateEducationDetails(sd, req.body._id)
            } 
            else {
              return addEducationDetails(sd, req.body._id)
            }
          })
          .then(function (result) {
            return result;
          })
          .then(function (result) {
            finalResult.push(result);
          })
        })

      return JSON.stringify(finalResult);
    })
    .then(function (finalResult) {
      res.json({
        "token": finalResult /*but here m getting empty result */
      })
    })
    .catch(function (e) { console.log(e); })
    .done();
}

如果您替换_.each并使用q.all,则上述代码也可以更清晰。

  • 注意:你正在使用javascript es5让你的代码很长,你可以使用javascript es6缩短它并使用箭头函数代替function(x, y) {}