感觉使用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最大的好处是更“好看”。当然如果你不在乎好看难看那确实没什么大用。
最后我的代码成了这样
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。
感觉楼上写的都好可怕,太多代码了,我一般就写几行
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