感觉使用promise多了一步参数传递的过程,让人觉得本来就复杂的逻辑更复杂了。而且要不停的考虑作用域的问题。 我用的express框架。
配合 async await 就好用了。promise 提供了统一的异步处理方式。
promise就是为了让回调写的更清晰的。。
个人任务这就是解决问题的工具的一种,工具有很多,一些类库也可以解决,用起来更爽的情况下,何不选择最舒服的一个呢
主要是回调坑太多。
@stonephp @1renhaO @Qiubaowei @HuQinyang 我的用法可能是有点问题,但是我觉得优化后仍然麻烦些
// promise写法 let nodeName = req.body.nodeName; let parentId = req.body.parentId; let isLastNode = req.body.isLastNode; console.log('parentid:',req.body) //0表示根分类 if(parentId==0){ Assortment.create({ nodeName:nodeName, parentId:parentId, isLastNode:isLastNode }) .then(function (assortment) { let symptom = assortment.pedigree; symptom.push(assortment._id); if(isLastNode=='true'){ Symptom.create({symptom:symptom},function (err, symptom) { if(err) symptom }); } res.send(errors.e0) }) .catch(function (err) { throw err }); }else { Assortment.findOne({_id:parentId}) .then(function (parent) { let pedigree = parent.pedigree; pedigree.push(parent._id); return Assortment.create({ nodeName:nodeName, parentId:parentId, isLastNode:isLastNode, pedigree:pedigree }) }) .then(function (assortment) { let symptom = assortment.pedigree; symptom.push(assortment._id); if(isLastNode=='true') Symptom.create({symptom:symptom}); res.send(errors.e0) }) .catch(function (err) { throw err }); } // 以下是常规写法 if(parentId==0){ Assortment.create({ nodeName:nodeName, parentId:parentId, isLastNode:isLastNode },function (err,assortment) { if(err) throw err; if(isLastNode){ Symptom.create({symptom:assortment.pedigree.push(assortment._id)}) } res.send() }); }else { Assortment.findOne({_id:parentId},function (err, parent) { if(err) throw err; Assortment.create({ nodeName:nodeName, parentId:parentId, isLastNode:isLastNode, pedigree:parent.pedigree.push(parent._id) },function (err, assortment) { if(err) throw err; if(isLastNode){ Symptom.create({symptom:assortment.pedigree.push(assortment._id)}) } }) }) }
http://www.cnblogs.com/YikaJ/p/4996174.html 但是我们仍然不可忽视某些问题,例如我们必须忍受各个逻辑被一个又一个的then()包裹起来,每一个函数都有其独立的作用域,如果为了共享某个数据就必须挂在最外层
@qujinxiong 你可以先:
let a, b, c, d;
也就在最外层多写一行而已。不过等到await支持了以后就简单了。Promise最大的好处是更“好看”。当然如果你不在乎好看难看那确实没什么大用。
await
最后我的代码成了这样
let nodeName = req.body.nodeName; let parentId = req.body.parentId; let isLastNode = req.body.isLastNode; // 0表示根分类 if (parentId == 0) { Assortment.create({ nodeName: nodeName, parentId: parentId, isLastNode: isLastNode }, function (err, assortment) { if (err) throw err; if (isLastNode == 'true') { //创建症状 let symptom = assortment.pedigree; symptom.push(assortment._id); Symptom.create({symptom: symptom}, function (err, symptom) { if (err) throw err; //将新生成symptom的_id绑定到最后节点上 assortment.symptomId = symptom._id; assortment.save(); }); } res.send(errors.e0) }); } else { Assortment.findOne({_id: parentId}, function (err, parent) { if (err) throw err; if (parent.isLastNode) { res.send(errors.e113); return; } if (!parent) { res.send(errors.e112); return; } let pedigree = parent.pedigree; pedigree.push(parent._id); Assortment.create({ nodeName: nodeName, parentId: parentId, isLastNode: isLastNode, pedigree: pedigree }, function (err, assortment) { if (err) throw err; if (isLastNode == 'true') { //创建症状 let symptom = assortment.pedigree; symptom.push(assortment._id); Symptom.create({symptom: symptom}, function (err, symptom) { if (err) throw err; //将新生成symptom的_id绑定到最后节点上 assortment.symptomId = symptom._id; assortment.save(); }) } res.send(errors.e0) }) }) }
谁能把这种复杂的逻辑关系,用promise的方式完美的重现一下吗?反正我纠结了很久,最后还是抛弃了promise。
感觉楼上写的都好可怕,太多代码了,我一般就写几行
@qujinxiong
P=Promise.resolve(); P.then(()=>{ if(parentId == 0){ return //todo Assortment.creat }else{ return //todo Assortment.findOne //todo return Assortment.create }}) .then((assortment)) //todo
@SvenZhao 有没有注意到,有两层if-else的判别
楼主看我的,加入不用似不似觉得好麻烦[weather-api-promise-async-await地址]https://github.com/wang-weifeng/weather-api-promise-async-await
module.exports = function(request, reply) { var dependencies = { reply : reply, request: request }; return Promise .resolve() .bind(dependencies) .then(getCountOfInsights) .then(getInsights) .then(getCards) .then(replyWithInsights) .catch(replyWithImplementationErrors); };
看看我们的promise
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
配合 async await 就好用了。promise 提供了统一的异步处理方式。
promise就是为了让回调写的更清晰的。。
个人任务这就是解决问题的工具的一种,工具有很多,一些类库也可以解决,用起来更爽的情况下,何不选择最舒服的一个呢
主要是回调坑太多。
@stonephp @1renhaO @Qiubaowei @HuQinyang 我的用法可能是有点问题,但是我觉得优化后仍然麻烦些
http://www.cnblogs.com/YikaJ/p/4996174.html 但是我们仍然不可忽视某些问题,例如我们必须忍受各个逻辑被一个又一个的then()包裹起来,每一个函数都有其独立的作用域,如果为了共享某个数据就必须挂在最外层
@qujinxiong 你可以先:
也就在最外层多写一行而已。不过等到
await支持了以后就简单了。Promise最大的好处是更“好看”。当然如果你不在乎好看难看那确实没什么大用。最后我的代码成了这样
谁能把这种复杂的逻辑关系,用promise的方式完美的重现一下吗?反正我纠结了很久,最后还是抛弃了promise。
感觉楼上写的都好可怕,太多代码了,我一般就写几行
@qujinxiong
@SvenZhao 有没有注意到,有两层if-else的判别
楼主看我的,加入不用似不似觉得好麻烦[weather-api-promise-async-await地址]https://github.com/wang-weifeng/weather-api-promise-async-await
看看我们的promise