2016-07-04 88 views
0

我使用node.js与mongodb和q.js承诺。Node.js链接承诺使用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. 这是实现承诺的chainging的正确方法?
  2. 在最后的链中,我得到空结果,但是当我打印o/p到控制台我得到正确的结果。
  3. 我已经完成了getEducationDetail函数的迭代,这是正确的方式还是有其他选择。如果是这样,我怎么能达到相同的。
+1

要返回'finalResult'同步,但值只是异步填充。 – thefourtheye

回答

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) {}