callback地狱,厄运金字塔,node.js

我是node的新手,在完成我的API之后,我意识到所有这些都是一团糟,而且是一个callback地狱,这迫使我学习promise,现在一切都好,直到我面对一个有更多条件的API比可能的function,我的问题是如何做嵌套承诺,我的代码是关于一个父对象有一个用户附加到它,当删除路由被称为有很多条件:

  1. 如果这个家长有附加的孩子,它不应该被删除
  2. 没有孩子

    一个。 此父母在多个学校中,school_id从父对象的学校id和附属于其的用户对象中移除

    湾 如果这个家长没有孩子,只有在school_id,它应该被删除,用户连接也应该被删除

代码看起来像这样,它是100%的function

router.post('/delete',Validation, function (req, res) { var school_id = req.body.schoolId; var parent_id = req.body.selected[0]; / Student.findOne({parent_ids:parent_id},function(err,parentF){ if(err){ console.log(err); res.json({status:"error",message:"an error occurred"}); return }else if(parentF){ res.json({status:"error", message:"you can not delete a parent who has students associated with it"}); return; }else{ Parent.findOne({_id:parent_id},function(err,parent){ if(err){ console.log(err); res.json({status:"error",message:"an error occurred"}); return; }else{ if(parent.school_id.length>1){ var a = parent.school_id.indexOf(school_id); parent.school_id.pop(a); parent.save(function(err,parent){ if(err){ console.log(err); res.json({status:"error",message:"an error occurred"}); return; }else{ User.findOne({refid:parent_id},function(err,user){ if(err){ console.log(err); res.json({status:"error",message:"an error occurred"}); return; }else { user.school_id.pop(a); user.save(function(err) { if(err){ console.log(err); res.json({status:"error",message:"an error occurred"}); return; }else{ res.json({status: "success", message: "parent removed"}); return; } }); } }); } }); }else{ Parent.remove({_id: parent_id}, function (err) { if (err) { res.json({status: "error", message: err.message}); } else { User.remove({refid:parent_id},function(err){ if (err) { res.json({status: "error", message: "parent user wasn't deleted"}); return; }else{ res.json({status: "success", message: "parent data successfully deleted"}); return; } }); } }); } } }); } }); }); 

我正在尝试应用承诺,并使我的代码更好。

对于长期的问题抱歉,但我已经击中了任何build议表示赞赏

为findOne创build一些“承诺”风格的function,删除和保存

 let findOneP = (object, params) => new Promise((resolve, reject) => { object.findOne(params, (err, data) => { if (err) { return reject(err); } resolve(data); }); }); let removeP = (object, params) => new Promise((resolve, reject) => { object.remove(params, (err, data) => { if (err) { return reject(err); } resolve(data); }); }); let saveP = (object) => new Promise((resolve, reject) => { object.save((err, data) => { if (err) { return reject(err); } resolve(data); }); }); 

Bluebird Promisify可以轻松完成上述任务,但是由于您没有指定bluebird,所以我只是使用了一个快速且很脏的promise包装器

然后用诺言链让生活变得简单

 router.post('/delete',Validation, function (req, res) { var school_id = req.body.schoolId; var parent_id = req.body.selected[0]; findOneP(Student, {parent_ids: parent_id}) .then(parentF => { if (parentF) { throw "you can not delete a parent who has students associated with it"; } }) .then(() => findOneP(Parent, {_id: parent_id})) .then(parent => { if (parent.school_id.length > 1) { var a = parent.school_id.indexOf(school_id); parent.school_id.pop(a); return saveP(parent) .then(parent => findOneP(User, {refid: parent_id})) .then(user => saveP(user)) .then(() => "parent removed"); } return removeP(Parent,{_id: parent_id}) .then(() => removeP(User, {refid: parent_id})) .then(() => "parent data successfully deleted"); }) .then(message => res.json({status: "success",message})) .catch(message => res.json({status: "error",message})); }); 

我刚刚读到,你使用节点4.2 – 你可能需要

  1. 通过像巴贝尔这样的转译器来运行它
  2. 加载一个Promise库,就像蓝鸟

如果使用蓝鸟,使用它的promisifyfunction,而不是“手动”promisifying