为什么我觉得Promise一点都不好用? - CNode技术社区

为什么我觉得Promise一点都不好用?
发布于 9 年前 作者 JarvisQJ 5464 次浏览 来自 问答

感觉使用promise多了一步参数传递的过程,让人觉得本来就复杂的逻辑更复杂了。而且要不停的考虑作用域的问题。 我用的express框架。

14 回复

配合 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。

感觉楼上写的都好可怕,太多代码了,我一般就写几行

@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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /