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

感觉使用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

回到顶部